![]() |
1
94
答案是 two's complement 简而言之,Java(和大多数现代语言)不使用有符号大小表示来表示有符号整数。换言之,8位整数不是后跟7位无符号整数的符号位。 相反,负整数在称为2的补码的系统中表示,这使得硬件中的算术处理更容易,并且还消除了正零和负零的潜在模糊性。消除负零的一个副作用是,在范围的底部总是有一个额外的负数可用。 二的补码系统的另一个有趣的性质是,第一位是 有效地 二的补语并不十分复杂,但初步掌握二的补语是什么,它是如何工作的,为什么工作,可能超出了所谓的答案的范围。从维基百科的文章开始,或者用谷歌搜索更多资源。 为了简单地回答关于-128的查询,生成2的补码的基本思想是采用数字的无符号形式,反转所有位并加1。所以无符号128是10000000。倒过来,是01111111,再加上一个就得到10000000。所以在2的补码系统中,10000000是明确的-128而不是+128。大于或等于+128的数字不能用2的补码系统用8位表示,因为它们与负数的形式不明确。 |
![]() |
2
33
两人的互补作用如下; 一个字节由8位组成。
实例;
相同的位,但这一次,左边的位是
最小可能数 最大可能数
这就是为什么范围介于 -128和127 |
![]() |
3
8
正如詹姆斯在评论中指出的那样,这是因为二的补码就是这样工作的。 如果我们用其他术语来表示,你可以表示2^8=256种值。也就是说,在这个例子中用128个负数,127个正数和零。如果我们用7位来表示值,+1位表示符号,我们可以少表示一个值,也可以有两个零(这将是非常不幸的,因为比较两个值会更加复杂)。 |
|
4
3
基本数字类型可以表示2^n个数字。看一个n=2的例子。你可以代表四种情况,我们称之为a,b,c,d。然后你可以同意其中一种
|
![]() |
5
3
所以范围-2^7负(-128)到2^7-1正(127) |
|
6
1
所以看起来是这样的:
|
![]() |
7
0
不需要二的互补: 2^8(因为一个字节是8位数字,可以有2个值中的1个)=256,所以一个字节可以代表的最大值是256。 所以,代表数字-128到-1是我们范围的一半。 我相信这里的问题是为什么最大正值是127而不是128。这是因为我们必须表示数字0,所以包括0-127是我们范围内的其他128个可能性。 如果我们只允许正值,例如不允许负数的无符号字节,那么范围将是0-255,因为这是256个不同的值(包括0)。 |
![]() |
8
0
在接受了两个数字的恭维之后,我们总是留下一个表示额外数字的状态,所以我们把这个状态变成-128。 |
![]() |
Bfyuvf · 直接输入二进制可能的C++[重复] 2 年前 |
![]() |
Rado Harutyunyan · 在缓冲区节点中写入位 6 年前 |
![]() |
zaozaoer · >>java中带负字节值的and>>>运算符 6 年前 |
![]() |
rubyquartz · 交换无符号短整数的字节 6 年前 |
![]() |
DenoDev · C-十六进制输出中缺少0 6 年前 |