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

oka*_*ami 21 java bit twos-complement

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

例如:

int value = byte b = (byte) 0xFF;
System.out.println(value);
Run Code Online (Sandbox Code Playgroud)

它会打印-1吗?

cle*_*tus 19

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

  • 当将字节扩展为int时,Java正在进行符号扩展.http://en.wikipedia.org/wiki/Two%27s_complement#Sign_extension (2认同)

jas*_*son 13

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

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

  3. 带符号的字节0xff表示该值-1.这是因为Java使用二进制补码来表示有符号值.带符号的字节0xff表示-1因为它的最高有效位是1(因此它表示负值)并且其值为-128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1.


Sin*_*ion 5

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

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


Jam*_*ack 3

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

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