一、一个按别人框架搭、自己又整理了一遍的例子,对照下列解释看:
A | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 | 0000 | ||
A1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 0 | ||
原码 | A2 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | -1 | -2 | -3 | -4 | -5 | -6 | -7 | 0 | |
B | 0000 | 0001 | 0010 | 11 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 | 0000 | ||
反码 | B1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | -0 | 0 | |
补码 | B2 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 | 0 |
二、解释
〇【总述】反码与补码产生的原因:是为了使cpu对 减法/负数 的运算更有效率:不用去识别符号位,加只管加,而用不同 的二进制数表示十进制的正负数。 | 如:1011+1=1100 对应十进制 -3+1=-4 显然不对 | ||||||||||||||||
①原码的产生:从数字表示上来看,将一部分的二进制数码分于负数。由此,首先,以第一位作为符号位,其余位不变,是为原码A2。但是显然不满足“只管加”的效率原则。例子见右。 | |||||||||||||||||
②反码的产生:为了解决这个问题,参考了 模数运算/周期性的加法运算 所用的方法。即 n-m=n+(modulus-m),利用+模数会溢出的效果。即,对原码除符号位以外取反(互补数之和为模数,模数modulus在上面这个例子里就是23-1),得到B1,是为反码。 | |||||||||||||||||
③补码的产生:但是发现1111+1=0000->-0+1=0显然错误,故再将所有的反码对应+1,得到补码B2。 |
三、简单粗暴地记忆就是:
1.原码 |
+3的原码:0011 |
-3的原码:1011 |
2.反码 |
反码就是在原码的基础上,符号位不变其他位按位取反(就是0变1,1变0)就可以了。 |
+3的反码:0011 |
-3的反码:1100 |
3.补码 |
补码也非常的简单,就是在反码的基础上按照正常的加法运算加1。 |
+3的补码:0011 |
-3的补码:1101 |
参考链接:https://www.jianshu.com/p/ad19dabb3ae0 |