原码:
是将最高位作为符号位(0代码正,一代表负),其余各位代表数值本身的绝对值(以二进值表示).
如:
+7 原码: 0000 0111
-7 原码: 1000 0111
原码会出现的问题:
+0 原码: 0000 0000
-0 原码: 1000 0000
+0和-0其实都是0,但是原码表示确不唯一.所以计算机中没有采用原码来表示.
反码:
一个数如果为正,则实它的反码与原码相同,一个数如果为负,则符号位为1,其余各位对原码取反.
如:
+7 反码: 0000 0111
-7 反码: 1111 1000
反码会出现的问题:
+0 反码: 0000 0000
-0 反码: 1111 1111
+0和-0其实都是0,但是反码表示确不唯一.所以计算机中没有采用原码来表示.
补码:
利用溢出,我们可以将减法变成加法.
对于十进制数, 如果从9得到5, 可以用减法:
9 - 4 = 5;
因为4 + 6 = 10, 我们将6作为4的补数, 将上式的减法改写为加法:
9 + 6 15;
去掉高位1(也就是减去10), 得到结果5.
对于16进制数, 如果从C得到5, 可以用减法:
C - 7 = 5;
因为7 + 9 = 16, 我们将9作为7的补数, 将上式的减法改写为加法:
C + 9 = 15;
去掉高位1(也就是减去16), 得到结果5.
补码:
一个数如果为正,则它的原码,反码,补码相同;一个数如果为负,则符号位为1,
其于各位是对原码取反,然后整个数加1.
如:
+7 补码: 0000 0111
-7 补码: 1111 1001
负数补码计算方式:
原码: 1000 0111
第1步 原码取反: 1111 1000
第2步 整个数加1:
1111 1000
+1
----------------
1111 1001
0的补码:
+0 补码: 0000 0000
-0 补码: 0000 0000
原码: 1000 0000
第1步 原码取反: 1111 1111
第2步 整个数加1:
1111 1111
+1
-----------------
1 0000 0000(因为是二进制)
第3步 进位1被丢弃: 0000 0000
因为+0和-0的补码是唯一的, 所以计算机采用的是补码的方式.