定点数的表示和运算
一、定点数的表示
1.无符号数和有符号数的表示
- 无符号数:就是所有位数都是数值位。
- 有符号数:简单理解在机器中,数的正负号无法识别,取一位为符号位,其他为数值位。
2.机器数的定点表示
(1)定点小数
就是纯小数,约定小数点位置在符号位之后,有效值部分最高位之前。数值有效部分也被称为尾数 。
x0 | 隐含小数点 | x1 | x~2 | … | xn |
---|
- 当 x0=0,x1 ~ xn 均为1 时,X为其中能表达的最大正数,真值为1-2-n。
- 当 x0=1,x1 ~ xn 均为1 时,X为其原码能表达的最小负数,真值为-(1-2-n)。
(2)定点整数
就是纯整数,约定小数点位置在有效数值部分最低位之后。
x0 | x1 | x~2 | … | xn | 隐含小数点 |
---|
- 当 x0=0,x1 ~ xn 均为1 时,X为其中能表达的最大正数,真值为2n-1。
- 当 x0=1,x1 ~ xn 均为1 时,X为其原码能表达的最小负数数,真值为-(2n-1)。
3.原码、补码、反码、移码
(1)原码
- 直接十进制转二进制,前面加符号位即可。
- 原码的零有两种表示方式 一个是0000,另外一种是1000。
(2)补码
- 正数就等于原码
- 负数为符号位不变,数值位取反加一
- 负数补码数值位取反加一也可以求得原码
- 真值0的补码表示方式是唯一的
(3)反码
- 正数仍然等于原码
- 负数直接原码取反
- 真值0的反码不唯一
(4)移码
- 只有整数才有移码
- 移码就是补码的符号位取反,数值位不变
- 真值0的移码唯一
- 移码全为0时对应真值最小值-2n;移码全为1时,对应真值的最大值2n-1;
- 移码保持了数据原有大小,移码大则真值大。
二、定点数的运算
1.移位运算
(1)逻辑移位
- 就是无符号数移位,原码、补码、反码左移右移都是添加0
(2)算术移位
- 正数,不论原码、补码、反码,左右移动都是添0
- 负数
原码:左右移动都添加0
补码:左移添加0,右移添加1
反码:左右移动都是添加1
(3)循环移位
- 不丢数,循环移位
2.加减运算
- 主要在于补码的计算
- [A+B]补=[A]补+[B]补
- [A-B]补=[A]补+[-B]补
- [-B]补=[B]补连同符号位一起取反加1。
3.符号扩展
假设机器字长8位,A=15,B=-24求补码的符号扩展。
(1)先求原码,再求补码
- [A]补=00001111。
- [B]补=10011000取反加1=11101000。
(2)先求补码,再补位
- [A]补=1111,正数补0,所以为00001111。
- [B]补=11000取反加1=00111+1=01000,负数补0,所以为11101000。
4.溢出
小于最小数为下溢,大于最大值为上溢。两种情况会出现 溢出。
- 符号相同的数相加。
- 符号不同的数相减。
(1)采用采用一位符号位
- As、Bs分别为原来两个数的符号位,S为运算结果的符号位。
V=AsBs S ‾ \overline{S} S+ A ‾ \overline{A} A B ‾ \overline{B} BS。 - V=0,无溢出。
V=1,数据溢出。
(2)采用采用一位符号位和数据为的进位
- 进位和符号位如果求异或的结果为0则不溢出,为1则溢出。
(3)双符号位
- 双符号位S1S2求异或。
- 为0无溢出,为1则溢出。
- S1S2=01为正溢出,S1S2=10为负溢出。
5.定点数乘法运算
(1)原码一位乘法
-
例如x=-0.1101,y=0.1011,求x乘y
首先符号位和数值位分开算,符号为显然为1
00.0000 00000 1011
00.1101
———
00.1101
00.0110 右移 00110 1101 | 1
00.1101
———
01.0011
00.1001 右移 01001 1110 | 11
00.0100 右移 00100 1111 |011
00.1101
———
01.0001
00.1000 右移 01000 1111 | 1011
所以乘积为-0.10001111 -
最开始是从00000开始算
-
双符号运算
-
右移将除数全部移出为结束
-
运算次数和右移次数一样
(2)补码一位乘法(Booth算法)
-
例如x=-0.1101,y=0.1011,求x乘y
需要带上符号运算
[x]补=11.0011 [y]补=00.1011
[-x]补=00.1101
乘数后面补0跟双符号数一样
00.0000 010110
00.1101
———
00.1101
00.0110 右移 101011| 0
00.0000
———
00.0110
00.0011 右移 010101 | 10
11.0011
———
11.0110
11.1011 右移 001010 | 110
00.1101
———
00.1000
00.0100 右移 000101 | 0110
11.0011
———
11.0111
所以[x*y]补=11.01110001 得[xy]原=11.10001111,xy=-0.10001111 -
出现符号位11的情况,右移补1
-
运算次数比右移次数多一
-
- 到4个数字移出去的时候,再作一次运算结束。
-
看后两位,最后一位减前一位的值
如果为0,则加0
如果为1,则加[x]补
如果为-1,则加[-x]补
6.定点数除法
- 计算 X / Y X/Y X/Y
(1)不恢复余数除法
- 符号位单独求
- 采用单符号位
- 求 [ ∣ y ∣ ] 补 和 [ − ∣ y ∣ ] 补 [|y|]_{补}和[- |y|]_{补} [∣y∣]补和[−∣y∣]补
- 从被除数开始加,首先加 [ − ∣ y ∣ ] 补 [- |y|]_{补} [−∣y∣]补
- 计算完之后,部分余数为负,商上0
部分余数为正,商上1,然后商和部分余数都左移 - 结束标志:商的第一位移动到最高位
(2)补码除法运算(加减交替法)
- 符号位参加运算
- 双符号位
- 求 [ y ] 补 和 [ − y ] 补 [y]_{补}和[-y]_{补} [y]补和[−y]补
- 从被除数开始加,先看 [ x ] 补 和 [ y ] 补 [x]_{补}和[y]_{补} [x]补和[y]补是否异号,异号加 [ y ] 补 同 号 加 [ − y ] 补 [y]_{补}同号加[-y]_{补} [y]补同号加[−y]补
- 计算之后判断部分余数是否和 [ y ] 补 [y]_{补} [y]补异号,异号加 [ y ] 补 同 号 加 [ − y ] 补 [y]_{补}同号加[-y]_{补} [y]补同号加[−y]补
- 然后部分余数和商左移
- 结束标志:商的第一位移动到符号位
- 商最后一位恒置1