128的二进制表示为10000000。反转后得到01111111,再加一变成10000000
因此结论是-128的二进制表示为10000000。
+128在8位二进制补码下无法表示,但这意味着我们可以用9位二进制来表示它,所以128的二进制表示为010000000,其2's补码为-128即110000000。
-128的表示是10000000还是110000000?表示是否与比特位有关?
为什么不直接将8位下限设为-127,而要将-128写为10000000?
128的二进制表示为10000000。反转后得到01111111,再加一变成10000000
因此结论是-128的二进制表示为10000000。
+128在8位二进制补码下无法表示,但这意味着我们可以用9位二进制来表示它,所以128的二进制表示为010000000,其2's补码为-128即110000000。
-128的表示是10000000还是110000000?表示是否与比特位有关?
为什么不直接将8位下限设为-127,而要将-128写为10000000?
为什么无符号字节的范围是从-128到127?
事实上并不是这样。一个无符号字节(假设为8位)的范围是从0到255。
使用二进制补码的有符号字节的范围是从-128到127,这直接来源于二进制补码的定义:
01111111 = +127
01111110 = +126
01111101 = +125
...
00000001 = +1
00000000 = 0
11111111 = -1
...
10000010 = -126
10000001 = -127
10000000 = -128
那么 -128 的表示是 10000000 还是 110000000?
在8位中,它是10000000
,在一个假设的9位表示中,它是110000000
。
为什么不直接将8位的最小值设为-127呢?
将范围人为限制到-127并没有实现多少好处;你会排除一个完全有效的值,并且通常使代码更加复杂(否则你会用10000000
这个比特模式做什么?)。
Bits Unsigned 2's complement
00000000 0 0
00000001 1 1
00000010 2 2
01111110 126 126
01111111 127 127
10000000 128 −128
10000001 129 −127
10000010 130 −126
11111110 254 −2
11111111 255 −1
对于二进制补码系统,你可以画一个圆来理解这个系统。
这是4位版本。你可以轻松地自己开发一个8位版本。这个圆代表了这个二进制补码系统的实际意义。它是一个循环系统。这意味着它的表示取决于你给它的"跨度",因此同样的负数的8位版本将与16位版本不同。你可以将圆中给出的4位版本与表格中给出的8位版本中的相同负数进行比较。
0000 0
1111 -1 0001 1
1110 -2 0010 2
1101 -3 0011 3
1100 -4 0100 4
1011 -5 0101 5
1010 -6 0110 6
1001 -7 0111 7
1000 -8
顺便说一下,二进制补码算术与计算机内部的“固定”宽度计算存储(寄存器、内存等)相容。
在第一代计算机中,存在提供本机十进制算术的倾向。但很快就被废弃,转而采用“补码”或“循环”方案,因为从计算机的角度来看,十进制算术是奇怪的。我们之所以认为它很自然,是因为我们“有10个手指”。这些手指是我们祖先最早的计算工具。这就是为什么我们发现十进制系统是如此自然,它已经融入了我们的基因。
两个补码的替代方案包括:
10000000
分配含义,在这种情况下,许多接受有符号8位整数的函数都必须检查该无效值,浪费时间。(除非您的代码运行在将此位模式视为整数NaN的假设硬件上。)最好是给那个位模式分配一个含义,在两个补码表示中自然的含义是-128。
例如,在两个补码中,检查是否为负数相当于检查其最高位是否被设置。在一个10000000
无效的变体中,它是(伪代码)
if (highest_bit_zero(x))
return false;
else if (x == 0b10000000)
ERROR
else
return true;
-128
,你可以将其视为 NaN,就像浮点数一样。如果你使用与 IEEE FP 相同的语义,比较可能有 4 种结果:大于、等于、小于或无序。因此,如果 x
是 0x80
,则 x < 0
将为 false(无序)。但是 x > 0
也将为 false,x == 0
也将为 false。x == x
也是如此。 - Peter Cordes例如,使用二进制补码表示的八位整数范围为:
请注意,比正整数多一个负整数可以被表示。
来源:- http://programmedlessons.org/AssemblyTutorial/Chapter-08/ass08_20.html