为什么字节b =(字节)0xFF等于整数-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,依此类推。 请参阅二进制补码 ,它是使用的二进制编码机制。
-
b
被提升为int
以确定要调用的system.out.println
重载。 -
Java中的所有字节都是签名的。
-
带符号的字节
0xff
表示值-1
。 这是因为Java使用二进制补码来表示有符号值。 有符号字节0xff
表示-1
因为其最高有效位为1
(因此它表示负值),其值为-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1
。
也许你的困惑来自于为什么(byte)0xFF
在某种程度上等于(int)0xFFFFFFFF
。 这里发生的是从较小到较大的有符号类型的升级导致较小的值被符号扩展 ,从而最高有效位被复制到提升值的所有新位。 无符号类型不会变为符号扩展,它们将被零扩展,新位将始终为零。
如果它可以帮助你吞下它,以这种方式考虑它,任何大小的每个整数也有一些“幻像”位太重要而无法表示。 它们在那里,只是没有存储在变量中。 负数使这些位非零,并且当您将较小的值提升为较大的值时,正数对于幻像位全为零,这些幻像位变为实位。
如果使用带符号的int,则由于2补码而使用0xFF = -1。
这篇wiki文章解释得很好,请参阅右边的表格: http : //en.wikipedia.org/wiki/Two%27s_complement
因为Java(和大多数语言)使用二进制补码数学表示负整数值。 在二进制补码中,0xFF(11111111)表示(在有符号的int中)值-1。
它不只是Java做2的补码数学。 这就是我能想到的每个微处理器和DSP的数学方法。 所以,它是每种编程语言代表它的方式。
减少模数
byte = 256 0xff = 255
255/256 – >余数255
所以255 – 256 = -1
简单的逻辑干杯