前言
原码,反码,补码都是计算机对数字的二进制的定点表示方法
原码,反码,补码都使用8位数表示
很多人疑问用原码就可以表示,为什么还要有反码和补码?等众多问题
那么看完这篇文章大家就会明白
原码
怎么得到原码
原码的第一位为符号位:0是正数,1是负数
十进制 | 原码 |
5 | 00000101 |
-5 | 10000101 |
原码的范围
原码一共8位,第一位用作表示正负,还有7位用来表示数值大小
那么可以算出原码的数据范围是:-2^7-1到2^7-1(即-127到127)
避免有些同学可能转不过来弯为什么要减1:因为通过2^7=128我们要知道128是表示数的个数,而不是表示到0~128,它表示的是0到127这128个数(1111111是七位数可以表示的最大二进制数,即十进制的127)
接着我们就可以发现00000000和10000000都表示0,一个表示+0,一个表示-0
反码
为什么要有反码
既然原码已经可以表示正数和负数了为什么还要有反码
那是因为虽然原码可以表示负数,但是一旦使用原码表示负数参与运算就会出现错误
例如:
十进制计算:-5+1=-4
使用原码计算:10000101+00000001=10000110
原码计算结果转为十进制就是-6,显然结果有问题
这个时候就需要反码来解决这个问题
怎么得到反码
正数的反码是其本身(等于原码),负数的反码是符号位保持不变,其余位取反
十进制 | 原码 | 反码 |
1 | 00000001 | 00000001 |
-5 | 10000101 | 11111010 |
反码使用
使用反码计算负数,出来的是结果原码的反码
11111010+00000001=11111011
结果11111011的原码为10000100,十进制表示就是-4
反码数据范围
同样反码的数据范围也是:-127到127
补码
为什么要有补码
之所以有补码是因为反码不能处理跨0的计算
例如:-5+6=1
使用原码计算:10000110+00000111=10001101(十进制结果为-13)
使用反码计算:11111001+00000111=00000000(结果100000000,但是计算结果只留最低位8位00000000)
所以原码和反码计算结果都是错的
怎么得到补码
正数的补码是其本身,负数的补码等于其反码 +1
十进制 | 原码 | 反码 | 补码 |
6 | 00000111 | 00000111 | 00000111 |
-5 | 10000110 | 11111001 | 11111010 |
补码使用
使用补码与一个原码进行相加就会得到一个十进制数的原码
11111010+00000111=00000001(结果100000001,但是计算结果只留最低位8位00000001)
00000001的十进制就是1
补码范围
补码与原码,反码的范围不同它是:-128到127