为什么 byte b = (byte) 0xFF
等于 integer
-1
?
例子:
int value = byte b = (byte) 0xFF;
System.out.println(value);
它会打印出-1
吗?
为什么 byte b = (byte) 0xFF
等于 integer
-1
?
例子:
int value = byte b = (byte) 0xFF;
System.out.println(value);
它会打印出-1
吗?
在Java中,字节是带符号的。在二进制中,0x00表示0,0x01表示1,以此类推,但所有的1(即0xFF)表示-1,0xFE表示-2,以此类推。参见补码,这是使用的二进制编码机制。
在确定调用哪个system.out.println
的重载时,b
会被提升为一个int
。
Java中所有的字节都是有符号的。
有符号字节0xff
表示值为-1
。这是因为Java使用二进制补码表示有符号值。有符号字节0xff
代表-1
,因为它最高位为1
(所以它代表一个负数),其值为-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
。
(byte)0xFF
与 (int)0xFFFFFFFF
相等。这里发生的是从较小的有符号类型向较大的有符号类型提升会导致较小的值被进行了符号扩展,即最高位被复制到所有新的提升值的位中。无符号类型不会进行符号扩展,它们进行零扩展,新的位将始终为零。
如果这样有助于您理解,可以这样想,任何大小的整数也都有一些“幻影”位,这些位过于重要而无法表示。它们存在,只是未存储在变量中。负数具有这些位非零,而正数在提升较小值到较大值时,这些幻影位变成了实际位。
取模运算
byte = 256 0xff = 255
255 / 256 -> 余数为 255
因此 255 - 256 = -1
简单逻辑 干杯
不仅仅是Java使用2的补码数学。我能想到的每个微处理器和DSP都是这样做数学的方式。因此,这也是每种编程语言所代表的方式。