原码、反码和补码

整数的表示

以下以单字节表示数为例

无符号数

对于无符号整数,一个字节最多可以表示256个整数:[0~255]

有符号整数

对于有符号的整数,则需要占用1位最高位作为符号位,此后7位可表示128位整数:[0~127]

对于有符号整数的表示主要有四种表示方法:

原码(符号绝对值法)

原码将最高位作为符号位(0表示正,1表示负):[-127~127]

注意: 此时存在 +0-0 两个 0

反码

反码同样将最高位作为符号位(0表示正,1表示负),但互为相反数的两个数,各位的值相反

例:

+6表示为:0000 0110
-6表示为:1111 1001(而原码是:1000 0110)

总结:整数的反码是原码本身,而负数的反码是原码的符号位不变,其它位取反。

注意: 由于存在互为相反数的关系,因此同样存在 +0(0000 0000)和 -0(1111 1111)两个 0

补码

补码仍然采用最高位作为符号位(0表示正,1表示负),正数的补码还是它本身,负数的补码分两步:

  1. 先求出该负数的反码
  2. 在反码的基础上 +1

此时,+0(0000 0000)和 -0(0000 0000)表示相同,而原来表示 -0 的 1000 0000(原码表示)以及 1111 1111(反码表示,此时已有对应的补码值:-1)。

那么,1000 0000 是哪个负数的补码呢?我们逆推一下:

  1. 求反码为:1000 0000 - 1 = 0111 1111

  2. 求原码为:0000 0000

显然: 他不是一个负数(因为一个负数的符号位为1),根据对称性我们也可以知道,8位可以表示位256(偶数)个数,但补码表示法的 +0 和 -0 只有一种表示法,因此,势必会多出来一个数(没错,就是1000 0000),我们当然可以用他表示为-0(让0000 0000表示+0),或者128或用作其他用途,按照补码的加法规则,此时1000 0000可表示为128。

总结:正数的补码是它的本身,负数的补码是它的反码加1(即:原码的符号位不变,其它位取反后加1)。

移码(余数码)

移码的表示方式有些特殊,它又叫做余数码,例如:对于8位数表示,称为余128 $$=2^7$$码,它的位表示是用它的真值加上余数来表示的,例如:如果想要用移码表示 -6(或者说获得-8的移码),首先用 -6 加上 128,得到 122,然后 122 的无符号表示就是 -6 的移码,:移码的表示方式,将[-128 ~ 127]映射到了[0 ~ 255]的无符号数上面。

有趣的是: 移码与补码仅在最高位的符号位相反,其他位表示相同!

例:

-6表示补码为:1111 1010
-6表示移码为:0111 1010(-6 + 128 = 122的无符号表示)

运算

反码运算

使用反码进行运算时,如果最高位产生了进位,则需要将进位加到最低位上,此过程为循环进位

补码运算

补码将最高位产生的进位直接丢弃

补码加法示例

0111 1111	127
0000 0001	+ 1
1000 0000	= 128
posted @ 2022-04-21 20:43  LEVRY  阅读(433)  评论(0)    收藏  举报