【问题标题】:Why are these two different representations (dec vs. hex) of integers different in Java?为什么这两种不同的整数表示(十进制与十六进制)在 Java 中不同?
【发布时间】:2016-06-09 02:47:03
【问题描述】:

假设我有两个整数,一个是十进制的,另一个是十六进制的:

int myInt01 = 0xc7d23020;
int myInt02 = 3352440864;

两者都是相同的数字,但是当我尝试将十进制整数分配给 Java 中的变量时,我收到错误:

error: integer number too large: 3352440864

但是当我将十六进制整数分配给 Java 中的变量时,一切正常。

为什么会这样?

【问题讨论】:

  • @ChiefTwoPencils - 真的吗?
  • 不,我弄错了。没有得到 c 下来。
  • 如果你在谷歌上搜索十六进制到十进制转换器并输入 0xc7d23020,它会输出 3352440864,反之亦然。
  • 你检查过那个十六进制变量的值吗?不是3352440864,而是-942526432

标签: java hex decimal


【解决方案1】:

我猜这是预期的行为:这个数字的二进制表示具有最高有效位集,采用 32 位数据类型。由于在 Java 中 int 是有符号数据类型,因此最高有效位保留用于数字的符号。因此,该数字不是有效的正数。这就是编译器告诉你的。但是,由于它是一个有效的负整数,所以当您使用十六进制表示分配它时它不会报错。

您可以尝试使用十六进制表示法将需要超过 32 位的数字分配给整数变量。这将导致编译器错误。

【讨论】:

    【解决方案2】:

    这是因为0xc7d23020 被解释为-942526432,这是一个有效的int 值,而3352440864 显然是一个错误的int 值,因为它高于限制2147483647

    【讨论】:

    • 为什么被解释为-942526432
    • 我想补充一些关于 Java ints 的东西,这是对两个人的恭维。
    【解决方案3】:

    int 变量可以容纳的最大值是2147483647。这就是它给出该错误的原因。你可以自己检查一下:System.out.println(Integer.MAX_VALUE);

    找出一个int变量可以容纳的最小值System.out.println(Integer.MIN_VALUE);

    【讨论】:

    • 是的,就是这个原因!您需要使用 long 变量来保存该数字,而不是 int。
    • 那么,为什么十六进制值有效,而十进制值无效?
    • 实际上指定的数字是负数
    • 这个答案几乎回答了这个问题。
    • @JonnyHenly 不是真的。为什么 Java 让我分配基数 16 而不是基数 10?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    相关资源
    最近更新 更多