为什么Java中的字节范围是-128到127?
我不明白为什么一个字节的最低值是-128
。 我可以看到最高值是127
,因为它是二进制的01111111
,但是如何表示-128
只有8位,其中一个用于符号? 正128将已经是8位,即10000000
,然后你需要第9位来表示负号。
有人可以请帮我解释一下。
答案是二补 。
简而言之,Java(和大多数现代语言)并不代表使用有符号幅度表示的有符号整数。 换句话说,一个8位整数不是一个符号位,后面是一个7位无符号整数。
相反,负整数表示在一个称为二进制补码的系统中,这使得在硬件中更容易进行算术处理,并消除了具有正零和负零的可能的模糊性。 消除负零的副作用是在范围的底部总是有一个额外的负数。
二进制补码系统的另一个有趣的特性是第一个比特有效地作为一个符号指示器(即所有以比特1开始的数字都是负数),但接下来的七个比特不能被解释为一个无符号数符号位被应用。
二的补码不是非常复杂的,但是对补码是什么以及它是如何以及为什么起作用的话,最初得到很好的掌握可能超出了答案的范围。 从维基百科文章开始,或谷歌术语更多的资源。
为了简短地解释你对-128的查询,产生二进制补码数字的基本思想是取数字的无符号forms,将所有的位反转并加1。 所以无符号128是10000000.反转,它是01111111,再加一个10000000。 所以在一个二进制补码系统中,10000000毫不含糊地是-128而不是+128。 大于或等于+128的数字根本不能用8的二进制补码表示,因为它们与负数的forms是不一致的。
正如詹姆斯在他的评论中指出的那样,这是因为这是两个补充的作品。
如果我们用其他术语来表示,则可以表示2 ^ 8 = 256种值。 在这种情况下,它被用作128个负数,127个正数,以及零。 如果我们用7位来表示一个符号的+1位,我们可以代表一个较小的值,并且也会有两个零(这将是非常不幸的,因为比较两个值会因此而变得更加复杂)。
除了这里的答案外,我可以解释一下如何补充工作。
一个字节由8位组成。
00000000表示0
11111111意味着255
但是,如果我们这样说,就不能区分是正数还是负数。 因为这个原因,左边的位给了我们这个信息。 如果左边的位是0,则可以开始在零的顶部添加其他位的值。 如果该位是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之间。
基本的数字types可以代表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
仍然成立。
在Java中,所有像byte short int long double这样的variables都被写为signed。 所以非常简单,头位始终指定什么是(负数或正数),但是因为数字可以被二分为二,因此被转换为负数,默认为0。 所以它看起来像这样:
这是积极的
+ | 0001001
1 | 0001001
这是消极的
– | 0001001
0 | 0001001
作为一个字节短小负面的是
-000000011111111
0000000011111111
字节由8位—> 1位符号(正或负)7位值组成
所以范围-2 ^ 7负(-128)到2 ^ 7 -1正(127)
没有进入二进制补码:2 ^ 8(因为一个字节是8位,可以有2个值中的一个)= 256,所以一个字节可以表示的最大个体值是256.因此,表示数字-128到-1是我们的一半范围。 我相信这里的问题是为什么最大正值是127,而不是128.这是因为我们必须表示数字0,所以包含0-127是我们的范围的其他128个可能性。
如果我们只允许正值,比如一个无符号的字节,其中负数是不可能的,那么这个范围就是0-255,因为它们是256个不同的值(包括0)。