Java中整数在位级别上是如何表示的?

92

我正试图理解Java如何在内部存储整数。我知道所有的Java原始整数都是带符号的,(除了short?)。这意味着一个字节中可用的位数比数字少一个。

我的问题是,所有整数(正数和负数)是否都以二进制补码形式存储,还是只有负数以二进制补码形式存储?

我看到规范中写着x位二进制补码数。但我经常感到困惑。

例如:

  int x = 15; // Stored as binary as is?  00000000 00000000 00000000 00001111?
  int y = -22; // Stored as two complemented value? 11111111 11111111 11111111 11101010

编辑

明确一下,x = 15

   In binary as is: `00000000 00000000 00000000 00001111'
  Two's complement: `11111111 11111111 11111111 11110001`

因此,如果您的答案是 所有 数字都以二进制补码形式存储,则:

  int x = 15; // 11111111 11111111 11111111 11110001
  int y = -22 // 11111111 11111111 11111111 11101010

这里的混淆在于标志说,两个数字都是负数。也许我误读/误解了它?

编辑 不确定我的问题是否令人困惑。被迫分开提问:

我的问题确切地说:正数是以二进制形式存储的吗?而负数则以二进制补码形式存储吗?

有些人说所有数字都以二进制补码形式存储,而另一个答案则表示只有负数以二进制补码形式存储。


顺便说一下,char 是唯一的无符号整数值。 - undefined
11个回答

0
简而言之,每个位在存储int、long、short和byte时都带有一个带有大小的符号。
以byte为例,一个byte可以存储范围为-128到127的值,一个byte由8个位组成。最高有效位(最左边)的符号为负,其他所有位都带有正号,即[- + + + + + + +]。
例如,
[0 0 0 0 0 0 0 0] = 0
[0 0 0 0 0 0 0 1] = +2^0 = 1
[0 0 0 0 1 0 0 1] = +2^3 +2^0 = 9
[0 1 1 1 1 1 1 1] = +2^6 +2^5 +2^4 +2^3 +2^2 + 2^1 + 2^0 = 127
[1 0 0 0 1 0 0 1] = -2^7 +2^3 +2^0 = -119
[1 0 0 0 0 0 0 0] = -2^7 = -128
[1 1 1 1 1 1 1 1] = -2^7 +2^6 +2^5 +2^4 +2^3 +2^2 + 2^1 + 2^0 = -1

只有大小改变,int(32位)、short(16位)、long(64位),但基本概念保持不变,即最高有效位表示负号,而其他位表示正号。
免责声明:其他答案也在提到二进制补码时试图传达相同的意思。

每个位都带有大小的符号?一个只能是零或一,没有地方放符号和大小!(回答一个11年前的问题,而且已经得到高票和接受的答案,没有什么太大的收获,也没有添加任何新内容) - undefined
@user85421 我回答时尽量用最简单的词语来概括。并非为了赢得好感,而是觉得这可能对社区有所帮助。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接