2.2 定点数的表示与运算
最后更新于
最后更新于
无符号数:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。
n位无符号数的表示范围是
真值:该数字的实际值,包含正负;
机器数:用数字表示正负号的二进制数
定点小数:约定符号位后面就是小数点
+0.75D = 0.11B
-0.75D =1.11B
n位尾数的定点小数的表示范围:
定点整数:约定小数点在数值的最后
+3D = 011.B
-3D = 111.B
n位尾数的定点整数的表示范围:
整数的“,”和小数的“.”都是用于表示分割,在计算机中实际不存在
用最高位表示符号位,设 x 为真值,则有:
纯小数的原码:
纯整数的原码(n为整数位数):
正数的补码:补码与原码相同
负数的补码:原码符号位不变,数值位取反,末位加1
当一个正数和一个负数互为补数时,他们的绝对值之和称为模数。
类似于时钟,+2 = -10,12为模数
纯小数的补码:
纯整数的补码
正数的反码:反码与原码相同
负数的反码:原码符号位不变,数值位取反
\begin{align} [x_{1}]_{移} &= 2^{7} + 10101\\&=10000000+10101 \\&= 1,0010101 \end{align} \begin{align} [x_{2}]_{移} &= 2^{7} + (-10101)\\&=10000000+(-10101) \\&= 0,1101011 \end{align}
同一个数,补码和移码只有符号位相反
移码大真值就大,移码小真值就小
移码的0唯一
对于r进制而言:
可以与加减法结合实现乘除法。
机器码采用有符号数,符号位不参与
正数
空位补0
负数
原码:0
补码:
左移:0
右移:1
反码:1
机器码采用无符号数,直接补0。
补码直接相加即可
先求原码:
则可得补码:
可得结果:
大于机器所能表示的最大正数称为上溢;
小于机器所能表示的最小负数称为下溢。
当两个符号相同的数相加或者两个符号相异的数相减时才会发生溢出。
对溢出的判断有几种方式:
若V=0,则无溢出
若V=1,则发生了溢出
即“模2补码”
即“模4补码”
正数符号位为00,负数符号位为11。
00:正数无溢出
01:正数有溢出
11:负数无溢出
10:负数有溢出
模4补码存储时仍然为一个符号位,因为正确的表示两位符号位必然是相同的
当送入ALU时,才将原来的符号位同时送入ALU的双符号位中
符号位单独处理:乘数与被乘数异或
绝对值相乘
ACC存放乘积高位,MQ存放乘数、乘积低位,X存放被乘数
每次看MQ中最低位
为1,ACC加上被乘数
为0,ACC加上0
每次运算后右移一位,高位补0
直到MQ仅剩原符号位,舍去不参与运算
小数点位于ACC第一位(乘积符号位)后
绝对值相乘
ACC=00000,X=01101,MQ=01011
1,ACC=0.0000+0.1101=0.1101
ACC=00110,MQ=10101
1,ACC=00110+01101=10011
ACC=01001,MQ=11010
0,ACC=01001
ACC=00100,MQ=11101
1,ACC=00100+01101=10001
ACC=01000,MQ=11110,MQ此时仅剩最后一位
结果:0.10001111
修改符号位:1.10001111
符号位参与运算
移位相加
ACC存放乘积高位,X存放被乘数,采用双符号位补码
MQ采用单符号位补码,最后一位为辅助位
每次看MQ中最低位与辅助位
每次运算后右移一位
正数高位补0
负数高位补1
直到MQ仅剩原符号位,再做一次加法,不再移位得到结果
小数点位于ACC第二位(乘积符号位)后
ACC=00.0000,X=00.1101,MQ=0.10110
0-1=-1,ACC=00.0000+00.1101=00.1101
ACC=00.0110,MQ=1.01011
1-1=0,ACC=00.0110
ACC=00.0011,MQ=0.10101
1-0=1,ACC=00.0011+11.0011=11.0110
ACC=11.1011,MQ=0.01010
0-1=-1,ACC=11.1011+00.1101=00.1000
ACC=00.0100,MQ=0.00101,此时MQ仅剩最后一位原符号位
1-0=1,ACC=00.0100+11.0011=11.0111
结果:11.01110001
符号位单独处理:除数与被除数异或
绝对值相除
ACC存放被除数、余数,MQ存放商,X存放除数
每次先默认商1,ACC-除数
结果为负数,错误,商0,ACC+除数
结果为正数,ACC保持不变
每次运算后左移一位,低位补0
直到相应字长的商全部求出
小数点位于MQ第一位(商符号位)后
例:机器字长为5位(含一位符号位),x=0.1011,y=0.1101,采用原码恢复余数法求x/y
绝对值相除
ACC=01011,X=01101,MQ=00000
ACC=10110,MQ=00000
ACC=10010,MQ=00010
ACC=01010,MQ=00110
ACC=10100,MQ=01100
结果:01101
加上符号位:0.1101
不恢复余数
与恢复余数法相比,当商1结果为负数时
直接将商置0
ACC左移一位+|除数|:直接得到新余数
结果为正数:商直接置1
负数:继续
只有最后一位商0时需要恢复余数
例:机器字长为5位(含一位符号位),x=0.1011,y=0.1101,采用原码恢复余数法求x/y
绝对值相除
ACC=01011,X=01101,MQ=00000
MQ=00000,ACC=11100
ACC=10010,MQ=00010
ACC=01010,MQ=00110
MQ=00110,ACC=11010
结果:01101
加上符号位:0.1101
符号位参与运算
移位相加
ACC、X,采用双符号位补码
MQ采用单符号位补码,最后一位为辅助位
第一步
被除数与除数同号:ACC - 除数
被除数与除数异号:ACC + 除数
对比余数和除数(ACC和X)
同号:商1,余数左移一位 - 除数
异号:商0,余数左移一位 + 除数
最后一位的商恒置为1
ACC=00.1000,X=11.0101,MQ=0.0000
同号,MQ=00001,ACC=11.1010
异号,Q=00010,ACC=00.1010
同号,MQ=00101,ACC=11.1110
异号,Q=01010,ACC=01.0010
最后一位固定为1
长整数变为短整数:0x000286a1 --> 0x86a1(截断高位)
短整数变为长整数:符号扩展
有符号数变为无符号数:0xef1f(真值-3421) --> 0xef1f(真值61215)
都是对于多字节数据
大端:类似正常阅读方式
小端:倒过来
例:分别用大端和小端模式存储12345678H
若字长为n+1位,则原码的表示范围:
若字长为n+1位,则补码的表示范围:
移码就是在真值X上加上一个常数(偏置值) ,通常这个常数取 。
例: ,,字长为8位,则其移码表示为:
移码全为0:
移码全为1:
右移n位:
左移n位:
例:设机器字长为8位(含一位符号位),A=15,B=-24,求 和
另外 连同符号位一起取反再+1
设A的符号位为 ,B的符号位为,运算结果的符号位为,则溢出的逻辑表达式为:
设符号位的进位 ,最高数位的进位,则当和不同时发生溢出。
记两个符号位分别为和,则 ,若V=0,无溢出;V=1,有溢出。
例:机器字长5位(含一位符号位),=1.1101,=0.1011,采用原码一位乘法求x*y
符号位:10=1
=0.1101,=0.1011
辅助位-MQ最低位=1:
辅助位-MQ最低位=0:
辅助位-MQ最低位=-1:
例:机器字长5位(含一位符号位),=-0.1101,=+0.1011,采用booth算法求x*y
=11.0011,=00.1101,=0.1101
符号位:00=0
=0.1011,=0.1101,=0.1101,=1.0011
商1,MQ=00001,ACC+==01011+10011=11110
商0,MQ=00000,ACC+==11110+01101=01011
商1,MQ=00001,ACC+==10110+10011=01001
商1,MQ=00011,ACC+==10010+10011=00101
商1,MQ=00111,ACC+==01010+10011=11101
商0,MQ=00110,ACC+==11101+01101=01010
商1,MQ=01101,ACC+==10100+10011=00111,此时五位商已经全部得到
符号位:00=0
=0.1011,=0.1101,=0.1101,=1.0011
商1,MQ=00001,ACC+==01011+10011=11110
ACC+==11100+01101=01001,MQ=00001
商1,MQ=00011,ACC+==10010+10011=00101
商1,MQ=00111,ACC+==01010+10011=11101
ACC+==11010+01101=00111,MQ=01101,此时五位商已经全部得到
例:机器字长5位(含一位符号位),=+0.1000,=-0.1011,采用补码加减交替法求x/y
=00.1000,=11.0101,=00.1011
异号,ACC+==00.1000+11.0101=11.1101
ACC+==11.1010+00.1011=00.0101
ACC+==00.1010+11.0101=11.1111
ACC+==11.1110+00.1011=00.1001
ACC+==01.0010+11.0101=00.0111
结果:1.0101 余 0.0111