二进制的加减运算(原码,反码,补码的理解)
- 最近又看了,二进制加减法运算。对于很多新人可能对于二进制的加减法运算有不理解的地方,下面我将自己 的一些理解写下来,一方面做一些记录,另一方面希望能对大家有帮助。
计算机中数据的存储
-
我们都知道计算机智能识别机器语言即0和1,那么我平时的十进制数在计算机中是如何存储的呢?计算机需要将其转换成二进制进行存储,即以0 和1的形式来表示。
- 下面以单字节数的二进制来说明:
5的二进制表示: 0000 0101
-5的二进制表示:1000 0101
其最高位代表正负,1表示负,0表示正。
- 下面以单字节数的二进制来说明:
-
**但是计算机在存储时并不是直接按照其二进制表示(原码)来存储的,而是按照其补码形式来进行存储的,这很重要!**因为计算机在运算时默认将原来的数表示成补码再参与运算,然后得到结果。注意此时的结果也是输出结果的补码形式。简而言之,当计算机在输出时(在屏幕上打印时)会将其转换成原码,再转换成对应的十进制数进行输出。
1.原码
- 原码就是原数的二进制表示
如上面的
5 : 0000 0101
-5: 1000 0101
2.反码
- 正数的反码是其本身,负数的的反码等于其对应的正数的原码按位取反;当然也有一种说法负数的反码是其符号位不变其余位按位取反,其实仔细分析下你会发现这两种的说法是一样的。举例说明:
5的反码: 0000 0101
-5的反码:1111 1010
这种写法是按照其对应的整数的原码按位取反得到的。
第二种说法符号位不变,其余位按位取反。
-5的原码:1000 0101
-5的反码: 1111 1010
我们会发现其符号位没变,数据位每一位都按位取反了。
其实仔细分析 ,这就是符号位提前取反了。其余位再按位取反而已,和第一种说法本质上是一致的。
3.补码
-
之所以会有补码一说其实是因为,对计算机来说计算减法并没有我们实际中的那么简单,所以才有补码一说用来简化计算机中的减法。
正数的补码就是其本身,如,5 :0000 0101
负数的补码 = 其反码 + 1
如 ,-5的补码 = 1111 1010 +1 =1111 1011
那么 5 -5其实就等于5 +(-5),用其补码来计算:
0000 0101
+1111 1011
1 0000 0000可以看出这里发生了数据溢出,因为是一个字节,最高位舍掉,取其低八位,即 0000 0000表示+0,原码也是其本身,所以输出时会会输出0。有一点需要注意的,最终得出的是其补码的形式,在输出时会转换成原码的二进制形式再转换成对应的十进制数,理解了这一点我们就不会再被二进制的计算搞的眼花缭乱了。
-
以上的例子可能并不明显,所以再举一个例子,仍以单字节计算为例。
7 - 9 在计算机中的运算过程和输出过程:
7 - 9 = 7 +(-9)
原码:
7 :0000 0111
-9 : 1000 1001反码:
7 : 0000 0111
-9: 1111 0110补码:]
7 : 0000 0111
-9 :1111 0111
7 + (-9)= 0000 0111 (补码)+ 1111 0111(补码)= 1111 1110(补码)
其原码 = 补码减1然后再按位取反,所以1111 1110的原码= ~(1111 1110 -1)= 1000 0010(原码),可以发现其是等于-2的。 -
总结:计算机中数据是以二进制补码形式存储的,所以计算机在计算时是以其二进制补码形式来计算的。在输出时再将补码的结果转化成原码,再将原码二进制转换成十进制或者其他我们需要的进制数。