2009-11-05 422 views

回答

1

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

17

字节是用Java签名的。二进制0x00为0,0x01为1等等,但所有1(即0xFF)为-1,0xFE为-2等等。见Two's complement,这是使用的二进制编码机制。

+2

当将字节扩展为int时,Java正在进行符号扩展。 http://en.wikipedia.org/wiki/Two%27s_complement#Sign_extension – shf301 2009-11-05 03:10:16

+0

实际上符号扩展是正确的原因 – 2011-11-09 14:01:44

13
  1. b在确定要调用哪个的system.out.println超负荷提升到int

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

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

-1

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

+2

严格地说,一些语言(例如C和C++)没有指定什么表示被用于整数。它是平台特定的。另一方面Java *确实指定2的补码表示。 – 2009-11-05 03:35:53

5

也许你的困惑来源于为什么(byte)0xFF在某种程度上等于(int)0xFFFFFFFF。这里发生的事情是从较小到较大的签名类型的升级,导致较小的值为符号扩展,由此将最高有效位复制到升级值的所有新位。一个无符号类型不会变成符号扩展,它们得到零扩展,新的位将始终为零。

如果它可以帮助你吞下它,认为它是这样的,任何尺寸的每个整数也有一些“虚拟”位过于显著来表示。他们在那里,只是没有存储在变量中。一个负数具有非零的位,当您将较小的值提升为较大的值时,正数对于幻影位具有全零,这些幻影位变为实际位。

-1

降低模

字节= 256 0xff的= 255

256分之255 - >其余部分255

所以255 - 256 = -1

简易逻辑 干杯