为什么Java中的字节范围是-128到127?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (40)

我不明白为什么字节的最低值可以采取-128。我可以看到最高值是127,因为它是01111111二进制的,但是如何表示-128只有8位,其中一个用于符号?正值128将已经是8位,即10000000,然后你需要第9位来表示负号。

有人可以请帮我解释一下。

提问于
用户回答回答于

简而言之,Java(以及大多数现代语言)并不使用有符号幅度表示来表示带符号整数。换句话说,一个8位整数不是一个符号位,后面跟着一个7位无符号整数。

取而代之的是,负整数在一个称为二进制补码的系统中表示,该系统允许在硬件中更容易地进行算术处理,并消除了具有正零和负零的可能的模糊性。消除负零的副作用是在范围的底部总是有一个额外的负数。

二进制补码系统的另一个有趣特性是第一个比特有效地用作符号指示符(即所有以比特1开始的数字都是负数),但接下来的七个比特不能被解释为一个无符号数符号位被应用。

二进制补码不是非常复杂的,但是对二进制补码是什么以及它是如何工作以及为什么起作用的初步良好的控制可能超出了答案的范围。从维基百科文章开始,或谷歌术语获取更多资源。

为了简短地解答你关于-128的查询,产生二进制补码数字的基本思想是取数字的无符号形式,反转所有位并加1。因此,无符号128是10000000.反转,它是01111111,并且添加一个再次获得10000000。所以在一个二进制补码系统中,10000000毫不含糊地是-128而不是+128。大于或等于+128的数字根本无法使用二进制补码系统以8位来表示,因为它们与负数的形式不一致。

用户回答回答于

因为这是两个补码的作用。

如果我们用其他术语来表示,则可以表示2 ^ 8 = 256种值。在这种情况下,它被用作128个负数,127个正数和零。如果我们用7位来表示一个符号的+1位,我们可以表示一个较小的值,并且也会有两个零(这会非常不幸,因为比较两个值会因此而变得更加复杂)。

扫码关注云+社区