摘要:当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。
二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”
。在二进制码中,为了区分正负数,采用最高位是符号位的方法来区分,正数的符号位为0、负数的符号位为1.
剩下的就是这个数的绝对值部分,可以采用原码、反码、补码3种形式来表示绝对值部分。 但对于二进制运算而言,原码的运算不够方便,当两个数相加时,先要判断这两个数的符号是否相同,符号不同的话,还要判断哪一个数的绝对值更大.所以在计算机中,通常都是采用补码形式
正整数的补码与原码形式相同
例如+7的8位二进制补码是00000111;
负整数的补码则可以通过下列方式:将这个负整数的绝对值求反加1,连同符号位1表示
例如-7的8位二进制补码:将-7的绝对值7求反加1得1111001,连同符号位1一起就是11111001。
原码:计算机的二进制形式存在
反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一 位取反
补码:正数的补码就是其原码;负数的反码+1就是补码
备注:
正数补码与原码相同,
如单字节的数字7,在计算机中就表示为:0000 0111。
负数用补码表示
如单字节的数字-7,在计算机中表示为1111 1001。
分析:计算机内部采用2的补码(Two's Complement)表示负数。
计算机内部用什么方式表示负数,只要能够保持一一对应的关系,就可以用任意方式表示负数。既然可以任意选择,那么理应选择一种最方便的方式。
2的补码就是最方便的方式。它的便利体现在,所有的加法运算可以使用同一种电路完成。
如:-8两种表示方法。错误表示方法10001000;正确表示方法为11111000
两数相加:16+(-8)=?
16二进制为00010000,
00010000
+10001000
---------
10011000 结果:换十进制为-24是不正确的
在这种情况下,正常的加法规则不适用于正数与负数的加法,因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。从电路上说,就是必须为加法运算做两种电路。
若采用补码方式:
00010000
+11111000
---------
100001000
按照正常的加法规则,得到的结果是100001000。注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。这说明了,2的补码表示法可以将加法运算规则,扩展到整个整数集,从而用一套电路就可以实现全部整数的加法。
的补码的本质
在回答2的补码为什么能正确实现加法运算之前,我们先看看它的本质,也就是那两个步骤的转换方法是怎么来的。
要将正数转成对应的负数,其实只要用0减去这个数就可以了。比如,-8其实就是0-8。
已知8的二进制是00001000,-8就可以用下面的式子求出:
00000000
-00001000
---------
因为00000000(被减数)小于0000100(减数),所以不够减。请回忆一下小学算术,如果被减数的某一位小于减数,我们怎么办?很简单,问上一位借1就可以了。
所以,0000000也问上一位借了1,也就是说,被减数其实是100000000,算式也就改写成:
100000000
-00001000
---------
11111000
进一步观察,可以发现100000000 = 11111111 + 1,所以上面的式子可以拆成两个:
11111111
-00001000
---------
11110111
+00000001
---------
11111000
2的补码的两个转换步骤就是这么来的。
为什么正数加法适用于2的补码?
实际上,我们要证明的是,X-Y或X+(-Y)可以用X加上Y的2的补码完成。
Y的2的补码等于(11111111-Y)+1。所以,X加上Y的2的补码,就等于:
X + (11111111-Y) + 1
我们假定这个算式的结果等于Z,即 Z = X + (11111111-Y) + 1
接下来,分成两种情况讨论。
1.若X小于Y,那么结果肯定是个负数了,我们采用二进制的补码的逆运算,求出它对应的正绝对值,再在前面加一个负号就可以了
第一步:计算Z、X、Y的二进制补码的表达式 Z = -((11111111 - Z) + 1);X = (11111111 - X) + 1;Y = (11111111 - Y) + 1;
第二步:根据表达式X + (11111111 - Y) + 1来替换计算:-( ( ( 11111111 - X) + 1 ) - ( ( 11111111 - Y ) + 1 ) ) = -(11111111 - X + 1 - 11111111 + Y - 1) = -( -X + Y) = X - Y;
2.若X大于Y,那结果肯定是正数,那意味着Z肯定大于11111111,那根据8位机,第九位溢出了,就要舍去,表达式为(不太明白...):
Z = Z - 100000000 = X + (11111111 - Y) + 1 - 100000000 = X - Y;
这就证明了,在正常的加法规则下,可以利用2的补码得到正数与负数相加的正确结果。换言之,计算机只要部署加法电路和补码电路,就可以完成所有整数的加法。
另记录下反码的规律
~ (反码): 01001 ~ 后 10110,即1变0 , 0变1
6反码结果是-7, 整数a的反码结果= -a -1
(~6) = -7
-6 = -7 + 1;
(~8) = -9:-8 = -9 + 1;
(~16) = -17:-16 = -17 + 1;
~(-6)= -(-6)-1=5 ;
(~a)先把a变为-a,-a - 1 = (~a);
https://www.cnblogs.com/x_wukong/p/3952688.html