Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java中的字节范围是128到127?_Java_Byte - Fatal编程技术网

为什么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卡