原码/补码的加减运算and溢出判断
小数点的处理:
任意一个二进制数S都可以表示为
研究小数点就要研究阶码E的取值:
- 若E=0,则表示纯小数——代表定点小数;
例0.1111表示+0.1111,1.1111表示-0.1111。 - 若E=n,则表示纯正数——代表定点正数;
例01111表示+1111,11111表示-1111。 - E=m,且0<m<n,小数点在中间n个数内浮动——代表浮点数。
定点数的运算:
1、运算中,采用补码来表示定点数。
补码表示定点整数时,和原码、反码相比的优点 |
---|
符号位可以跟数值位一起参加运算 |
可以用加法方便的实现减法运算 |
0的表示是唯一的 |
可以多表示一个最小负数 |
2、定点数的移位运算
当某二进制数相当于小数点做n位左移或者右移,相当于该数乘以或者除以2^n。
由于机器数的字长都是固定的,当机器数左移或者右移时,都会造成n位低位或者n位高位出现空缺。
逻辑移位(无符号数)
逻辑移位的规则 | |
---|---|
左移 | 高位移丢,低位补0 |
右移 | 低位移丢,高位添0 |
算术移位
- 当机器数为正
例:设机器字长为8,A=+26
A=+26=+11010
[A]原=[A]补=[A]反=0,0011010
移位操作 | 机器数 | 真值 |
---|---|---|
移位前 | 0,0011010 | +26 |
左移一位 | 0,0110100 | +52 |
左移两位 | 0,1101000 | +104 |
右移一位 | 0,0001101 | +13 |
右移两位 | 0,0000110 | +6 |
当机器数为正,三码相等,左移右移都补0 。
- 当机器数为负
例:设机器字长为8,A=-26
[A]原=1,0011010
[A]补=1,1100110
[A]反=1,1100101
移码操作 | 机器数 | 真值 |
---|---|---|
移位前 | 1,0011010 | -26 |
左移一位 | 1,0110100 | -52 |
右移一位 | 1,0001101 | -13 |
原码——左移右移补0。
移码操作 | 机器数 | 真值 |
---|---|---|
移位前 | 1,1100110 | -26 |
左移一位 | 1,1001100 | -52 |
右移一位 | 1,1110011 | -13 |
补码——左移补0,右移添1。
移码操作 | 机器数 | 真值 |
---|---|---|
移位前 | 1,1100101 | -26 |
左移一位 | 1,1001011 | -52 |
右移一位 | 1,1110010 | -13 |
反码——左移右移都添1。
定点数的加/减运算
1、原码
- 加法规则:先判断符号位,若相同,绝对值相加,结果符号位不变;若不同,则做减法,绝对值大的数减去绝对值小的数,结果与绝对值大的数相同。(同号求和,异号求差)
- 减法规则:两个原码表示的数相减,首先将减数的符号取反,然后将被减数与符号取反后的减数按原码加法进行运算。(同号求差,异号求和)
例:[x]原=0.1101,[y]原=1.1001,求[x+y]原、[x-y]原?
[x+y]原:
符号位不同,做减法:
[-y]原=0.0111
最高数值位产生进位,所在数值位 .0100,再加上第一操作数的符号0
[x-y]原:
减数的符号取反,
因为数值最高位产生进位,结果正上溢。
2、补码
-
补码加法
两个数的补码相加,符号位参加运算,且两数和的补码等于两数的补码之和。
例:x=+0.1011,y=-0.1001,求[x+y]补?
[x]补=0.1011 [y]补=1.0111
则:[x+y]补=0.1011+1.0111=0.0010(符号位进位舍去)
即:[x+y]补=0.0010,真值为:+0.0010。
-
补码减法
由于运算器仅有加法器,则:
例:已知[x]补=0.0010,[y]补=1.1010,求[x-y]补?
[y]补=1.1010,则[-y]补=0.0110
则[x-y]补=0.0010+0.0110=0.1000。
3、特殊的情况——溢出(补码)
码制 | 范围 |
---|---|
原码 | -127~127 |
补码 | -128~127 |
反码 | -127~127 |
- 溢出产生的原因:当两(小)数相加大于(1或)上界127,称为上溢或者正溢出,两(小)数相加小于(-1或)下界-128,称为下溢或负溢出。
- 发生溢出,数值位扩充,数值位“跑“到符号位,然后取代符号位。导致”两正数相加等于负数,两负数相加等于正数“。
- 计算机判断溢出的方法
①单符号——两符号相同的运算,运算结果符号相反的为溢出。
发生溢出的情况 |
---|
加法:符号相同的两数相加 |
减法:符号不同的两数相减 |
②双符号法(变形补码法)——检测正负溢出
特点:
- 两位符号位要联同数值部分一起参加运算。
- 高位符号位产生的进位直接丢弃。
原则:
- 当两位符号位不同时,表示溢出。
- 高位符号位永远代表真正的符号位。
正溢出
例:已知[x]补=00.1011,[y]补=00.0111,求[x+y]补=?
负溢出:
例:已知[x]补=11.0101,[y]补=11.1001,求[x+y]补=?
③当两个单符号:
当两个单符号位补码进行加减运算时,若最高数值号位向符号位的进位值C与符号位产生的进位输出值S相同,则没有溢出发生;如果两个进位值不同,则发生溢出。
判断公式:C⊕S
例:已知[x]补=1.0101,[y]补=1.1001,求[x+y]补=?
例:已知[x]补=1.1000,[y]补=1.1000,求[x+y]补=?
《计算机组成原理》——唐朔飞