机器码:
1. 原码表示法
x=+11001,则[x]原=011001x=-10101,则 [x]原=110101
2. 反码表示法 (用于快速求补码)
二进制数求反码:
正数:符号取0、各位数码位保持不变;
负数:符号取1,各位数码位全部取反,
x= +10111 >0 按定义: [x]反= 0 10111
y= -11011 <0 按定义: [y]反= 1 00100
3. (1)通过反码求补码的方法:
当x为正数时: [x]补=[x]反
当x为负数时: [x]补=[x]反+1
(2)求一个负数的补码(正数保持不变)的另一种有效的转换方法:
对于负数,先写出其原码,符号位保持为1,数值部分由低位向高位转换,对开始遇到的0和第一个1,保持原值不变,第一个1以后的各位均取反。
4.(1)移码中符号位xn表示的规律与原码、补码、反码相反。
(2)移码在数值上与补码一致,但是符号位与补码正好相反!
0的原码表示不唯一,有两种。
0的补码只有一种形式.
0的反码也有两种,不唯一硕。
即:[+0]反=000…0;[-0]反=111…1
[+0]原 =0000…0. [-0]原 =1000…0.
例:已知x=+1011,y=-1101,求 [x]补、[y]补
按定义:x>0 [x]补 =[x]反= 0,1011(注:正数的补码、反码, 数值保持不变!)
y<0 [y]补 =[y]反+1
=1,0010+1
=1,0011
例: y=-0.110100, 求[y]补
解: [y]原=1110 100 (y<0)
∴ [y]补=1001 100
[y]反=1001011
[y]补=1001011+1
=1001100(结果相同)
附:
原码的缺点1:
注意到:“+0”、“-0” 原码在机器中有两种形式:
原码的缺点2:
由于数值部分是采用绝对值表示的,因而特别适
合于乘除运算,但是加减法运算却比较麻烦,而加减
法运算正是计算机中最常使用的运算。
所以,必须探讨解决方法——补码则正是一种解决方法。
运算
补码加法补码加法的公式是:
[x]补+[y]补=[x+y]补。
∴ 补码加法可以连同符号位一起直接计算,即可得到“和的补码”
补码减法
补码的减法公式如下:
[x]补-[y]补=[x]补+[-y]补 =[x-y]补
下面的问题是:若已知[y]补,如何求取[-y]补?
对已知的[y]补:连同符号位一起,各位求反、最末位加1,即可得到 [-y]补。
即:[-y]补= [y]补+1
其中:符号[y]补表示:对[y]补连同符号位一起的求反。
[例] :x=+1011, y=+0100, 计算:x+y=?
解: [x]补=0,1011, [y]补=0,0100,
[x+y]补 0,1111 >0
∴ x+y=+1111
[例]:x=+1011, y=-0101, 求x+y。
[解:]
[x]补=0,1011 [y]补=1,1011
[x]补 0,1011
+[y]补 1,1011
[x+y]补 10,0110
∴ x+y=+0110
可见,补码加法的特点为:
1、符号位作为数的一部分直接参加运算;
2、超过模数(Mod)的进位要自动丢掉。(小数的计算同样适合,只是模数不同)。
[例] 已知 x1= +1101, x2 =-1110,
求: [x1]补, [-x1]补, [x2]补, [-x2]补。
[解:]
[x1]补=0,1101
[-x1]补= [x1]补+1=1,0010+0,0001=1,0011
[x2]补=1,0010
[-x2]补= [x2]补+1=0,1101+0,0001=0,1110
[例] x=+1101, y=+0110, 求x-y。
[解] : [x]补=0,1101
[y]补=0,0110 [-y]补=1,1010
[x]补 0,1101
+[-y]补 1,1010
[x-y]补 1 0,0111 >0
∴ x-y=+0111
溢出概念与检测方法
溢出的特征:
两个正数相加,结果为负(即:大于机器所能表示的最大正数),称为上溢。
两个负数相加,结果为正(即:小于机器所能表示的最小负数),称为下溢。
[例] x=+1011, y=+1001, 求x+y。
[解:]
[x]补=0,1011 [y]补=0,1001
[x]补 0,1011
+ [y]补 0,1001
[x+y]补 1,0100
∴ x+y=负值 ?
两正数相加,结果为负,显然错误。
(运算中出现了“上溢”)
为了判断“溢出”是否发生, 可采用双符号位的方法
结论:
采用变形补码后,两个补码相加,如果结果的符
号位出现“01”或“10”两种组合时, 表示发生溢出。
[例] x=+1100, y=+1000,求x+y。
[解] :
[x]补=00,1100, [y]补=00,1000
[x]补 00,1100
+[y]补 00,1000
01,0100
两个符号位出现“01”, 表示已溢出, 即结果大于最大值。(上溢)
[例] x=-1100, y=-0110, 求x+y
[解] :
[x]补=11,0100, [y]补=11,1010
[x]补 11,0100
+[y]补 11,1010
10,1110
两个符号位出现“10”,表示已溢出,即结果小于最小值。(下溢)
1、当以变形补码运算,运算结果的双符号位相异时,表示溢出;相同时,则表示未溢出。
2. 两变形补码相加,不论结果是否溢出,最高符号位Sf1总是结果的正确符号。