1 .在计算机系统中,数值一律用补数表示(存储)。
主要原因:补码可以用于统一处理符号位和其他位; 另外,减法也可以通过加法运算处理。 另外,以补数表示的2个数相加时,如果最高位(符号位)有进位,进位将被废弃。
2、补码和源代码转换过程基本相同。
求给定数值的补数表示,有以下两种情况。
)1)正数补数
和原始代码一样。
【例1】9的补数为00001001。
)2)负数补数
符号位为1、其馀位为该数绝对值的原码逐位反转; 然后在总数上加1。
【例2】求-7的补数。
因为如果给定数为负数,则符号位为“1”。
下七位:取7的原码(0000111 )逐位反转) 1111000 (加1 ) 111000 )
所以-7的补数是11111001。
已知一个数的补数,求源代码的操作可以分为两种情况。
)1)补码的符号位为“0”表示为正数,其原始符号为补码。
)2)如果补码的符号比特为“1”并指示为负数,则所给这个补码的补码是所要求的原始符号。
另一种方法是求负数的补数。
例如求-15的补数
步骤15:00001111
步骤2 :逐位取反(1变为0,0变为1 ),末尾加1。
11110001
再举一个例子验证,求-64的补数
64:01000000
11000000
【例3】已知一个补码为11111001时,原码为10000111(-7 )。
表示符号位为“1”,为负数,所以该位保持“1”。
剩下的7位1111001反转为0000110;
因为是加1,所以是10000111。
“源代码、反码、完成代码”文件中没有提到重要的概念“类型”。 现在,我将稍微介绍一下“型”的概念:
“模式”是指测量系统的计数范围。 例如钟表等。 计算机也可以看成一个测量仪器,它也有一个测量范围。 也就是说,都存在一个“型”。 例如:
时钟的测量范围为0~11,模式=12。
表示n位的计算机测量范围为2^(n )-1,模式2^(n ) )。
“型”实质上是计量器产生“溢出”的量,其值不在计量器上显示,计量器上只显示模具的馀数。 只要是有模子的计量器,就可以把减法加起来作为加法。
例如,假设当前时针指向10点,准确时间为6点,则调整时间有两种拨号方式:
一个是倒退4小时,也就是10-4=6
另一个是顺发8小时: 10 8=12 6=6
在12模式的系统中,加8和减4有同样的效果,所以所有减去4的运算都可以用加8来代替。
对“型”来说,8和4互为补数。 实际上在12模式的系统中,11和1、10和2、9和3、7和5、6和6都具有这一特性。 共同的特点是两者加起来等于模子。
对于计算机,其概念和方法完全相同。 n位计算机,n=8,
可显示的最大数为11111111,加上1为10000000(9位),但由于只有8位,所以最高位1自然会丢失。 由于返回0000000,8位二进制系统的模式为2^8。
在这样的系统中,减法问题也成为加法问题,只要用对应的补数来表示减数就可以了。 补数用于计算机对数的处理是补数。
另外两个概念
的补数(one's complement )是指正数=原码,负数=反码
二补数(two's complement )是指普通补数。
(3) .补数的绝对值(称为真值) ) )。
【例4】-65的补数为10111111
如果将10111111直接转换为十进制数,则为191而不是-65。
实际上,在计算机中,如果二进制数的最左边的位是1,则可以判定为负数,用补码表示。
要获得负二进制绝对值(称为真值),请反转每个位(包括符号位),再加上1即可获得真值。
例如,二进制值: 10111111(-65的补数)。
各位,01000000
加1:01000001(65的补数)。
代数加减运算
1、补数加法
[X Y]补=[X]补[Y]补
【例5】求X=0110011,Y=-0101001,[X Y]补充
[X]候补=00110011 [Y]候补=11010111
[X Y]补=[X]补[Y]补=00110011 11010111=00001010
注:由于计算机中运算器的位长是固定的,上述运算中发生的最高位进位将被舍弃,因此结果不同
不是100001010,而是00001010。
2、补数减法
[X-Y]增补=[X]增补- [Y]增补=[X]增补[-Y]增补
这里,[-Y]互补被称为负互补,而求负互补的方式是使包括已编码比特在内的所有比特逐比特反转; 然后在总数上加1。
【例6】1
+(-1) [十进制]1的原码00000001 转换成补码:00000001
-1的原码10000001 转换成补码:11111111
1+(-1)=0
00000001+11111111=00000000
00000000转换成十进制为0
0=0所以运算正确。
3、补码乘法
设被乘数【X】补=X0.X1X2……Xn-1,乘数【Y】补=Y0.Y1Y2……Yn-1,
【X*Y】补=【X】补×【Y】补,即乘数(被乘数)相乘的补码等于补码的相乘。
补码的代数解释
任何一个数都可以表示为-a=2^(n-1)-2^(n-1)-a;
这个假设a为正数,那么-a就是负数。而根据二进制转十进制数的方法,我们可以把a表示为:a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2)
这里k0,k1,k2,k(n-2)是1或者0,而且这里设a的二进制位数为n位,即其模为2^(n-1),而2^(n-1)其二项展开是:1+2^0+2^1+2^2+……+2^(n-2),而式子:-a=2^(n-1)-2^(n-1)-a中,2^(n-1)-a代入a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2)和2^(n-1)=1+2^0+2^1+2^2+……+2^(n-2)两式,2^(n-1)-a=(1-k(n-2))*2^(n-2)+(1-k(n-3))*2^(n-3)+……+(1-k2)*2^2+(1-k1)*2^1+(1-k0)*2^0+1,而这步转化正是取反再加1的规则的代数原理所在。因为这里k0,k1,k2,k3……不是0就是1,所以1-k0,1-k1,1-k2的运算就是二进制下的取反,而为什么要加1,追溯起来就是2^(n-1)的二项展开式最后还有一项1的缘故。而-a=2^(n-1)-2^(n-1)-a中,还有-2^(n-1)这项未解释,这项就是补码里首位的1,首位1在转化为十进制时要乘上2^(n-1),这正是n位二进制的模。
不能贴公式,所以看起来很麻烦,如果写成代数式子看起来是很方便的。
注:n位二进制,最高位为符号位,因此表示的数值范围-2^(n-1) ——2^(n-1)
-1,所以模为2^(n-1)。上面提到的8位二进制模为2^8是因为最高位非符号位,表示的数值范围为0——2^8-1。