10000000表示-128的补码,你可以理解为是一个特殊性。
各种8位二进制的表示法的数据范围如下:
原码:
-127
~
127
反码:
-127
~
127
补码:
-128
~
127
补码运算:正数为原码本身,负数为原码取反加一
127为正数,其补码为原码0111
1111
-127为负数,其补码为原码0111
1111,取反1000
0000,加一,1000
0001。
根据这情况来看,表示-0,不是的,-0的原码是1000
0000补码是0000
0000。+0的补码也是0000
0000
于是就有了规定
1000
0000
定为
-128的补码
这种定法和上面数学层面的表述是一致的。
这样规定后,负数的补码在机器中就好算了。
在约定的范围内(-128-+127,对16位32位64位等扩大范围)
先将该负数取绝对值,再用二进制表示出这个绝对值
(不管符号位)
对该二进制数进行取反加一操作就得到负数的补码了
-128
绝对值是
128
128的二进制表示为:
1000
0000
取反
0111
1111
加1
1000
0000
这就是-128的补码
这种办法算出的结果符合“规定值”,规定而已。
先看看补码的由来吧。
用十进制来说明,就比较好理解。
限定,使用 2 位 10 进制数:
24 - 1 = 23
24 + 99 = (一百) 23
忽略超出 2 位的进位一百,+99 和-1 就是等效的。
+99,就称为-1 的补数。
如果,可以使用 3 位数呢?
那么,-1 的补数,就是 +999。
负数的补数=负数 + 10^n, n 是位数。
-----------------------
计算机用二进制,补数,就改称为:补码。
使用补码,就可以把减法,转换成加法运算,从而简化硬件。
8 位 2 进制的范围是:0000 0000 ~ 1111 1111 (十进制 255)。
-1 的补码,就是:-1 + 2^8 = 255 = 1111 1111(二进制)。
-2 的补码,就是:-2 + 256 = 254 = 1111 1110。
。。。
-128 的补码,是:-128 + 256 = 128 = 1000 0000。
负数的补码,就是这么来的。
补码,与原码反码毫无关系。
-----------------------
为什么是“取反、加一”?
下面用四位二进制来说明。
如果 X =-xxxx。
前面的负号(-)说明 X 是负数。后面的 x,是 1 或 0。
那么,[X]补 = -xxxx + 2^4
= -xxxx + 1 0000。
式中的 1 0000,可以写成: 1 + 1111。
那么,[X]补 = 1111-xxxx + 1。
式中的 1111-xxxx:
如果 x 是 0,1-x 就是 1。
如果 x 是 1,1-x 就是 0。
所以,这就是对 xxxx 取反。
式中的 + 1:
就是在取反之后,再加上 1。
经过“取反、加一”就得到 X 的补码了。
注意:
取反时,只是对 X 的绝对值 xxxx 取反。
此时,既没有说到“原码”,也没有说“反码”。
更没有说“符号位不变”。
所以,补码,它就是补码。
补码与“原码、反码和符号位”都没有关系。
-128 的二进制补码是怎么得来的?
-------------
你就算呗!
在八位机中,0 的补码就是:0000 0000。
-1,就是 0-1,你用二进制算一下,即可得到:1111 1111。
-2,二进制就是 0-10,你算一下,即可得到:1111 1110。
-3,二进制就是 0-11,你算一下,即可得到:1111 1101。
。。。
-128,二进制就是 0-1000 0000,算吧,即为:1000 0000。