为什么Java中的字节范围是128到127?
我不明白为什么一个字节可以接受的最小值是为什么Java中的字节范围是128到127?,java,byte,Java,Byte,我不明白为什么一个字节可以接受的最小值是-128。我可以看到最大的值是127,因为它是二进制的0111111,但是如何用8位来表示-128,其中一位用于符号?正128已经是8位,即10000000,然后需要第9位来表示负号 有人能帮我解释一下吗。答案是 简言之,Java(和大多数现代语言)不使用符号量表示来表示符号整数。换句话说,8位整数不是后跟7位无符号整数的符号位 相反,负整数在称为二的补码的系统中表示,这使得硬件中的算术处理更容易,并且还消除了正零和负零的潜在模糊性。消除负零的一个副作用是
-128
。我可以看到最大的值是127
,因为它是二进制的0111111
,但是如何用8位来表示-128
,其中一位用于符号?正128已经是8位,即10000000
,然后需要第9位来表示负号
有人能帮我解释一下吗。答案是
简言之,Java(和大多数现代语言)不使用符号量表示来表示符号整数。换句话说,8位整数不是后跟7位无符号整数的符号位
相反,负整数在称为二的补码的系统中表示,这使得硬件中的算术处理更容易,并且还消除了正零和负零的潜在模糊性。消除负零的一个副作用是,在范围的底部总是有一个额外的负数可用
二的补码系统的另一个有趣的特性是,第一位确实有效地起到符号指示符的作用(即,所有以位1开头的数字都是负数),但接下来的七位不能单独解释为应用符号位的无符号数
二的补语并不复杂,但一开始就很好地掌握二的补语是什么,它是如何工作的,为什么工作的,可能超出了SO答案的范围。从维基百科的文章开始,或者用谷歌搜索更多资源
为了简单地回答您关于-128的查询,生成2的补码背后的基本思想是采用数字的无符号形式,将所有位反转并加上1。所以未签名的128是10000000。倒过来,它是01111111,再加上一个就得到10000000。所以在2的补码系统中,10000000是明确的-128而不是+128。大于或等于+128的数字不能用2的补码系统用8位表示,因为它们与负数的形式不明确。正如詹姆斯在评论中指出的,这是因为2的补码是这样工作的
如果我们用其他术语来表示,可以表示2^8=256种值。在这种情况下,它被用作128个负数,127个正数和零。如果我们使用7位来表示值,+1位表示符号,我们可以表示一个较小的值,还可以有两个零(这将是非常不幸的,因为比较两个值会因此变得更复杂)。在java中,所有变量(如byte short int long float double)都是作为符号写入的。 所以很简单,头位总是指定什么是(负的或正的),但是因为数字可以被2除一半,所以0在默认情况下是正的。 看起来是这样的: 这是积极的
+|0001001
1 | 0001001
这是负面的
-|0001001
0 | 0001001
作为一个字节 短a负片为
-0000000 11111111
00000000 11111111
基本数字类型可以表示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(最小)!=最大值仍然有效。字节由8位-->1位符号(正或负)7位值组成
所以-2^7负(-128)到2^7-1正(127)的范围不需要两个补码:
2^8(因为一个字节是8位数字,可以有2个值中的1个)=256,所以一个字节可以表示的最大单个值是256。
因此,表示从-128到-1的数字是我们范围的一半。
我相信这里的问题是为什么最大正值是127而不是128。这是因为我们必须表示数字0,所以包括0-127是我们范围内的其他128种可能性
如果我们只允许正值,例如不允许负数的无符号字节,那么范围将是0-255,因为这是256个不同的值(包括0)。两个补码的工作原理如下
一个字节由8位组成
00000000表示0
11111意味着255
然而,如果数字是这样呈现的,我们不会区分结果数字是正还是负。由于这个原因,左边的位给了我们这个信息。如果左侧的位是0
,则可以开始在0
顶部添加其他位的值。如果位为1
,则应开始在-128
顶部添加。因为左边的位是2的7次方
实例
在这些示例中,左侧的位是1,这意味着我们将其他位的值添加到-128的顶部
10000000=-128(-128+0)
10000001=-127(-128+1)
1000011=-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
最大可能的数字
0111111=127
这就是为什么范围在-128和127之间的原因。在接受了两个人对数字的赞美之后,我们总是留下一个表示额外数字的状态,所以我们将该状态转换为-128。这是sim卡