为什么字节b =(字节)0xFF等于整数-1?

时间:2009-11-05 02:26:38

标签: java bit twos-complement

为什么byte b = (byte) 0xFF等于integer -1

例如:

int value = byte b = (byte) 0xFF;
System.out.println(value);

会打印-1吗?

7 个答案:

答案 0 :(得分:19)

字节用Java签名。在二进制0x00中为0,0x01为1,依此类推,但所有1(即0xFF)为-1,0xFE为-2,依此类推。请参阅Two's complement,这是使用的二进制编码机制。

答案 1 :(得分:13)

  1. b被提升为int,以确定要调用的system.out.println超载。

  2. Java中的所有字节都已签名。

  3. 签名字节0xff代表值-1。这是因为Java使用two's complement来表示签名值。带符号的字节0xff代表-1,因为其最重要的位是1(因此它表示负值),其值为-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

答案 2 :(得分:5)

也许你的困惑来自于(byte)0xFF在某种程度上等于(int)0xFFFFFFFF的原因。这里发生的是从较小到较大的签名类型的升级导致较小的值被符号扩展,其中最高有效位被复制到提升值的所有新位。无符号类型不会变为符号扩展,它们会被零扩展,新位将始终为零。

如果它可以帮助你吞下它,可以这样想,任何大小的每个整数也有一些“幻像”位太重要而无法表示。他们在那里,只是没有存储在变量中。负数具有非零的位数,当您将较小的值提升为较大的值时,正数对于幻像位全部为零,这些幻像位变为实数位。

答案 3 :(得分:3)

如果使用带符号的int,则由于2补码而使用0xFF = -1。

这篇wiki文章解释得很好,请参阅右边的表格: http://en.wikipedia.org/wiki/Two%27s_complement

答案 4 :(得分:1)

因为Java(和大多数语言)使用two's-complement math表示负整数值。在二进制补码中,0xFF(11111111)表示(在有符号的int中)值-1。

答案 5 :(得分:-1)

它不只是Java做2的补码数学。这就是我能想到的每个微处理器和DSP的数学方法。所以,它是每种编程语言代表它的方式。

答案 6 :(得分:-1)

减少模数

byte = 256 0xff = 255

255/256 - >余数255

所以255 - 256 = -1

简单逻辑 干杯