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

Bad*_*est 65 java byte

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

请有人帮我解释一下这个问题.

Tyl*_*nry 78

答案是两个补码.

简而言之,Java(和大多数现代语言)不使用带符号幅度表示来表示有符号整数.换句话说,8位整数不是符号位,后跟7位无符号整数.

相反,负整数在称为二进制补码的系统中表示,这允许在硬件中更容易的算术处理,并且还消除了具有正零和负零的潜在模糊性.消除负零的副作用是在范围的底部总有一个额外的负数可用.

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

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

为了尝试简要地解决关于-128的查询,生成二进制补码数的基本思想是采用无符号形式的数字,反转所有位并添加一个.因此,无符号128是10000000.反转,它是01111111,并且添加一个再次获得10000000.所以在二进制补码系统中,10000000明确地为-128而不是+128.大于或等于+128的数字不能使用二进制补码系统以8位表示,因为它们与负数的形式不一致.


Ad *_*tum 20

二的补充如下:

一个字节由8位组成.

00000000表示0

11111111表示255

但是,如果数字是这样呈现的,我们无法区分数字是正数还是负数.由于这个原因,左侧的位给了我们这个信息.如果左侧的位是0,则可以开始在顶部添加其他位的值zero.如果该位是1,您应该开始添加在顶部-128.因为左侧的位是两个七的幂.

例子;

在这些示例中,左侧的位为1,这意味着我们在-128的顶部添加其他位的值.

10000000 = -128(-128 + 0)

10000001 = -127(-128 + 1)

10000011 = -125(-128 + 3)

10000111 = -121(-128 + 7)

相同的字节,但这一次,左边的位是0.这意味着,我们开始添加到顶部0.

00000000 = 0(0 + 0)

00000001 = 1(0 + 1)

00000011 = 3(0 + 3)

00000111 = 7(0 + 7)

如果我们到现在为止,你的问题的答案,这个规则的8位最小可能的数字是;

10000000 = -128

可能的最大数量

011111111 = 127

这就是为什么,范围介于-128和127之间.

  • “最大可能的数字 011111111 = 127” - 为什么这里是 9 个数字? (2认同)

Tam*_*lei 8

正如詹姆斯在评论中指出的那样,这是因为两个人的补充是如何运作的.

如果我们用其他术语表示,你可以表示2 ^ 8 = 256种值.在这种情况下,使用128个负数,127个正数和0.如果我们使用7位来表示值,对于符号使用+1位,我们可以表示少一个值并且还将具有两个零(这将是非常不幸的,因为比较两个值会因此而更复杂).