我不明白为什么一个字节可以采用的最低值为-128
。我可以看到最高值是127
,因为它是二进制的01111111
,但是如何只用8位表示-128
,其中一个用于符号?正128已经是8位,即10000000
,然后你需要第9位来表示负号。
有人可以帮我解释一下。
答案 0 :(得分:75)
答案是two's complement。
简而言之,Java(和大多数现代语言)不使用带符号幅度表示来表示有符号整数。换句话说,8位整数不是符号位,后跟7位无符号整数。
相反,负整数在称为二进制补码的系统中表示,这允许在硬件中更容易的算术处理,并且还消除了具有正零和负零的潜在模糊性。消除负零的副作用是在范围的底部总有一个额外的负数可用。
二进制补码系统的另一个有趣的特性是第一位有效地作为符号指示符(即从位1开始的所有数字都是负数),但接下来的七位不是可以自己解释为应用符号位的无符号数。
两个补码并不是非常复杂,但是对两个补码是什么以及它如何以及为什么起作用的初步良好控制可能超出了SO答案的范围。从维基百科文章开始,或谷歌学习更多资源。
为了尝试简要地解决关于-128的查询,生成二进制补码数的基本思想是采用无符号形式的数字,反转所有位并添加一个。因此,无符号128是10000000.反转,它是01111111,并且添加一个再次获得10000000。所以在二进制补码系统中,10000000明确地为-128而不是+128。大于或等于+128的数字使用二进制补码系统不能用8位表示,因为它们与负数的形式不一致。
答案 1 :(得分:16)
二的补充如下:
一个字节由8位组成。
00000000表示0
11111111表示255
但是,如果数字是这样呈现的,我们就不会区分结果数字是正数还是负数。由于这个原因,左侧的位给了我们这个信息。如果左侧的位为0
,您可以开始在zero
的顶部添加其他位的值。如果该位为1
,您应该开始在-128
的顶部添加。因为左侧的位是2的七次幂。
实例;
在这些示例中,左侧的位为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)
如果我们到现在为止,请回答你的问题,
尽可能小的数字
10000000 = -128
最大可能的数字
011111111 = 127
这就是为什么范围在 -128到127 之间。
答案 2 :(得分:8)
詹姆斯在评论中指出,这是因为这是两个人的补充方式。
如果我们用其他术语表示,你可以表示2 ^ 8 = 256种值。在这种情况下,使用128个负数,127个正数和0。如果我们使用7位来表示值,对于符号为+1位,我们可以表示少一个值并且还将具有两个零(这将是非常不幸的,因为比较两个值会因此而更复杂)。
答案 3 :(得分:3)
基本数字类型可以表示2 ^ n个数字。看一个案例n = 2。你可以代表四种情况,我们称之为a,b,c,d。然后,您可以同意a=-2, b=-1, c=0, d=1
(这是可接受的方式)或a=-1, b=0, c=1, d=2
(可能,但未使用)。因此,如果您只有一个零且保持2 ^ n个状态,则abs(min) != max
增加n
会移动边框,但abs(min) != max
仍然有效。
答案 4 :(得分:1)
在java中所有变量如byte short int long float double都被写为signed。 所以非常简单,头位总是指定什么是(负数或正数),但由于数字是可分的,因此2的一半被移位为负数,0则默认为正数。 所以它看起来像这样:
这是积极的
+ | 0001001
1个| 0001001
这是负面的
- | 0001001
0 | 0001001
作为一个字节
简称否定是
-000000011111111
0000000011111111
答案 5 :(得分:1)
字节由8位组成---> 1位符号(正或负)7位值
所以范围-2 ^ 7负(-128)到2 ^ 7 -1正(127)
答案 6 :(得分:0)
没有进入两个补充: 2 ^ 8(因为一个字节是8位数,可以有2个值中的1个)= 256,所以一个字节可以表示的大多数单个值是256。 所以,代表-128到-1的数字是我们范围的一半。 我认为这里的问题是为什么最大正值为127而不是128.这是因为我们必须表示数字0,所以包含0-127是我们范围的其他128种可能性。
如果我们只允许正值,例如无符号字节,其中负数不可能,则范围为0-255,因为它们是256个不同的值(包括0)。
答案 7 :(得分:0)
在取完数字2的补码后,我们总是留下一个表示数字多余的状态,因此我们将该状态转换为-128。