23

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

前任:

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

它会打印-1吗?

4

7 回答 7

22

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

于 2009-11-05T02:30:40.620 回答
13
  1. bint在确定system.out.println调用哪个重载时提升为 an 。

  2. Java 中的所有字节都是有符号的。

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

于 2009-11-05T02:45:52.450 回答
5

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

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

于 2009-11-05T02:55:07.920 回答
3

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

这篇wiki文章解释得很好,见右表: http ://en.wikipedia.org/wiki/Two%27s_complement

于 2009-11-05T02:29:49.827 回答
1

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

于 2009-11-05T02:30:37.080 回答
0

减少模

字节 = 256 0xff = 255

255 / 256 -> 余数 255

所以 255 - 256 = -1

简单的逻辑干杯

于 2012-05-08T04:54:10.403 回答
-1

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

于 2009-11-05T02:54:48.577 回答