有符号数,有三种表示方法,即原码、反码和补码。
但是,在计算机系统中,数值一律用补码来表示和存储。
所以,在计算机系统中,原码和反码,都是不存在的。
----------
想要理解补码,要先从补数开始。
钟表的时针转一圈,周期是 12 小时。
倒拨 3 小时,就可以用正拨 9 小时代替。
9 就是-3 的补数。 9 = 12-3。
同理,分针倒拨 X 分,就可以用正拨(60-X)代替。
60 是分针的周期。
------
对于两位十进制 0~99,周期就是一百。
这时,减一,你就可以用 +99 代替。
25 - 1 = 24
25 + 99 = (1) 24
结果取两位,舍弃进位。这两种算法,功能就是相同的。
99,就称为-1 的补数。
98,就是-2 的补数。
。。。
负数的补数 = 周期 + 该负数。
利用补数,就可以用加法,代替减法运算。
正数,不需要求补数。
------
计算机使用二进制,补数,就改称:补码。
八位二进制,共有 256 个数字。负数的补码 = 256+该负数。
16 位二进制,共有 2^16 个数字。负数的补码 = 65536+ 该负数。
这就是补码的定义式。在你的书上,一定能找到这种算式。
------
在八位时:
-1 的补码是:256-1 = 255 = 1111 1111(二进制)。
-2 的补码是:254 = 1111 1110。
-3 的补码是:253 = 1111 1101。
。。。
-128 补码:128 = 1000 0000。
------
有了补码,计算机仅需要一个加法器,就可以加减通用了。
而原码和反码,不具备这种能力。
所以,原码和反码,究竟是怎么定义,就不必关心了。
因为,它们,毫无用处。
在数值前直接加一符号位的表示法。对于8位二进制来说:
[+7]原=
0
0000111
[-7]原=
1
0000111
反码:
正数的反码与原码相同。
负数的反码,符号位为“1”,数值部分按位取反。
[+7]反=
0
0000111
[-7]反=
1
1111000
补码:
正数的补码和原码相同。
负数的补码则是符号位为“1”,数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。
[+7]补=
0
0000111
[-7]补=
1
1111001