为什么这两种不同的整数表示法(十进制与十六进制)在 Java 中不同?

Why are these two different representations (dec vs. hex) of integers different in Java?

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

int myInt01 = 0xc7d23020;
int myInt02 = 3352440864;

它们是相同的数字,但是当我尝试将十进制整数分配给 Java 中的变量时,出现错误:

error: integer number too large: 3352440864

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

为什么会这样?

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

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

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

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

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