【问题标题】:Java Hex Number and ConditionalsJava 十六进制数和条件
【发布时间】:2018-09-15 17:15:43
【问题描述】:

我是 Java 新手,所以在条件句及其大小中使用十六进制数字时遇到问题。 Scanner 类也存在一些问题。我已经在 J​​ava 文档中搜索了原始数据类型。

节目是关于;取一个数字,看看它可以写入哪种数据类型并打印出适当的数据类型。

import java.util.*;
import java.io.*;
import java.lang.Integer;


public class Solution{
   public static void main(String []argh)
    {
      Scanner sc = new Scanner(System.in);
      long t=sc.nextInt();

    for(int i=0;i<t;i++)
    {

        try
        {
            long x=sc.nextLong();
            System.out.println(x+" can be fitted in:");
            if(x>=0x81 || x<=0x7f)System.out.println("* byte");
            if(x<=0x7fff || x>=0x8001)System.out.println("* short");
            if(x<=0x7fffffff || x>=0x80000001)System.out.println("* int");

            //if(x<= (0x7fffffffffffffff)|| x>= 
                       //(0x8000000000000001))System.out.println("*long");
            System.out.printf("\n\n%x\n\n",x);
            System.out.println();
        }
            catch(Exception e)
        {
            System.out.println(sc.next()+" can't be fitted anywhere.");
        }

      }
   }
 }

问题:

  1. 我收到一条错误消息,注释“if()”条件“too large int :0x7fffffffffffffff”为什么会这样?

  2. 我通过注释一些“if()”来运行程序,并给它“10”以搜索可能的数据类型,但这次它只打印“int”数据类型。

  3. 如果我给它“0x7b”作为输入,它会执行到“catch()”部分。为什么?

你能解释一下吗?谢谢。

【问题讨论】:

    标签: java types java.util.scanner


    【解决方案1】:

    我收到一条评论“if()”条件“too large int :0x7fffffffffffffff”的错误消息,为什么会这样?

    因为 0x7fffffffffffffffint 文字。 7fffffffffffffff 不适合 int。不过,它可以放入long。要使其成为long 文字,您必须在末尾添加lL

    if(x<= (0x7fffffffffffffffL)|| x>=
        (0x8000000000000001L))System.out.println("*long");
    

    但是这个if 语句是多余的,因为x 已经是long 类型,所以根据定义,它的值必须适合long

    实际上,使用每种类型的MAX_VALUEMIN_VALUE 常量比使用数字文字更不容易出错:

    System.out.println(x+" can be fitted in:");
    if(x>=Byte.MIN_VALUE || x<=Byte.MAX_VALUE)System.out.println("* byte");
    if(x>=Short.MIN_VALUE || x<=Short.MAX_VALUE)System.out.println("* short");
    if(x>= Integer.MIN_VALUE || x<=Integer.MAX_VALUE)System.out.println("* int");
    System.out.println("*long");
    

    我通过注释一些“if()”来运行程序并给它“10”以搜索可能的数据类型,但这次它只打印“int”数据类型。

    我无法重现此内容。您注释掉了哪些 if 语句?

    如果我给它“0x7b”作为输入,它会执行到“catch()”部分。为什么?

    Scanner.nextLong 无法识别十六进制数字,很遗憾。您可以将数字读取为字符串,检查其前缀,如果是 0x,然后去掉前两个字符,并将其解析为十六进制数字。

    【讨论】:

    • 谢谢 没想到“long”会写成“l”。是否有可能在 java 中,十六进制数字不像 C++ 那样按预期工作,因为我通过其类定义的最终数字更改了所有十六进制值,例如; Interger.MAX_VALUE 和所有东西都按预期工作。有点混乱...我的背景是 C++,所以我已经习惯了。谢谢。
    • 对长文字使用 L。 l 看起来太像1了。
    • @AndyTurner 是的。使用我使用的字体(摩纳哥),它们完全不同。还是编辑了。
    【解决方案2】:

    1) 这个数字不适合整数,请使用长字面量:0x7fffffffffffffffL

    2) 不清楚,如果你注释掉了?

    3) Scanner 不理解这种格式,请使用十进制表示

    但是,您还应该重新考虑您的条件。它们不会按照您的预期工作。例如 300 将被归类为字节。 (因为 300 > 129)。

    【讨论】:

      猜你喜欢
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-21
      • 2015-08-17
      • 2022-11-16
      • 2019-06-16
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多