定点数
定点数:小数点的位置固定——常规计数
浮点数:小数点的位置不固定—科学计数法
无符号数
整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值
- n位无符号数的表示范围:0~2n-1
- 通常只讨论无符号整数
- 通常表示指针、地址
有符号数
可以用原码、补码、反码三种方式来表示定点整数和顶点小数。还可用移码表示定点整数。
- 定点整数数的小数点约定在数的最右边
- 将最高位理解为负权重(-2n),其余位为正权重(+2n-i)
原码
- 一般用于表示浮点数的尾数 x
反码
-
正数的反码=原码
-
若符号位为0,则反码与原码相同
-
若符号位为1,则数值位全部取反
注意:反码只是原码转为补码的中间状态
补码
正数的补码=原码
负数的补码 = 反码末位+1(要考虑进位)
-
将负数补码转回原码的方法一样:尾数取反,末位+1(注意进位)
-
由 补快速求[-x]补的方法:符号位、数值位全部取反,末位+1
移码
在补码的基础上将符号位取反(移码只能用于表示整数)
特殊值表示
有符号数-1:位全1,可以辅助快速运算补码的十进制表示
无符号数最大值:位全1
数位扩展
对于无符号数与有符号正数:高位全部添0
对于有符号负数:高位全部添1
加减运算
- 加法正常运算
- 减法则将减数转换为补码与被减数相加即可完成减法运算,所以在ALU中只设计加法器节省硬件成本
注意:执行加法操作时,符号位一起参与运算
移位运算
算数移位
移位:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。可用移位运算实现乘法、除法
原码
符号位保持不变,仅对数值位进行移位。
- 右移:高位补0,低位舍弃,若舍弃的位=0,则相当于/2;若舍弃的位不等于0,则会丢失精度
- 左移:低位补0,高位舍弃,若舍弃的位=0,则相当于x2;若舍弃的位不等于0,则会出现严重误差
反码
正数反码的移位运算与原码相同,负数反码的规则如下
- 右移:高位补1,低位舍弃
- 左移:低位补1,高位舍弃
补码
正数补码的移位运算与原码相同
负数补码的移位运算:
- 右移(同反码):高位补1,低位舍弃
- 左移(同原码):低位补0,高位舍弃
逻辑移位
可以看作是对无符号数的“算数移位”
-
右移:高位补0,低位舍弃
-
左移:低位补0,高位舍弃
循环移位
-
对于循环右移则同理
加减运算
一般采用补码的加减运算
- 正数+整数才可能发生上溢–正+正=负
- 负数+负数才可能发生下溢—负+负=正
溢出判断:
方法一:设A的符号为As,B的符号为Bs,运算结果的符号为Ss,则溢出逻辑表达式为:$$V=A_sB_s\overline S_s+\overline A_s\overline B_sS_s$$
- 若V=0,表示无溢出;
- 若V=1,表示有溢出
方法二:采用一位符号位,根据数据位进位情况判断溢出符号位的进位Cs,最高数值位的进位Cs
符号位进位Cs | 最高数值位进位Cs | |
---|---|---|
上溢 | 0 | 1 |
下溢 | 1 | 0 |
即:Cs与Cs不同时有溢出
对Cs与Cs进行异或运算,设V为两者异或结果
- 若V=0,表示无溢出
- 若V=1,表示有溢出
方法三:双符号位法,正数符号位为00,负数符号位为11
加法运算后,双符号位=01则发生上溢;若双符号位=10则发生下溢,若两个符号位相同则未发生溢出。
乘法运算
原码乘法运算
判断—-加法—-右移
- 符号单独处理:符号位=$X_s\oplus Y_s$
- 数值位取绝对值进行乘法运算
实现:
- 判断乘数最低位是否为1,是则与乘积(初值为0)累加,否则不累加
- 进位位,乘积位ACC,乘数MQ同时右移
- 重复上述步骤
-
在逻辑右移的时候,ACC中的最低位会移到MQ中的最高位,在ACC中补0,MQ的最低位直接丢弃。
-
乘积高位:由ACC中不断的累加进位形成
-
乘积低位:由运算过程中不断地右移部分积到MQ中形成
补码乘法运算
- 符号位参与运算
- 补码一位乘法必须采用双符号位补码表示法
- 移位采用的是算术右移(符号位是啥就补啥)
除法运算
原码除法
- 计算机默认上商1,如果不应该商1则改为商0,并“恢复余数”
- ACC与MQ移位采用逻辑左移
- 求余数:(ACC)-(除数)->ACC,即(ACC)+[-|y|]补->ACC
- 符号位单独通过两个符号位异或进行判断
不恢复余数的方法
将负余数记为a,将a加上除数b得结果a+b,将a+b逻辑左移并减去b
上述语句可表达为(a+b)*2-b= 2 *a+b
-
基于上述优化方法进行的原码除法又称加减交替法
-
恢复余数法:当余数为负时商0,并+|除数|,再左移,再-除数
-
加减交替法:当余数为负时商0,并左移,再加|除数|
补码除法
- 符号位参与运算
- 被除数/余数、除数均采用双符号位
余数和除数同号,商1,余数左移一位减去除数;
余数和除数异号,商0,余数左移一位加上除数;
注意:末位商恒置为1,精度误差不超过2^-n^,好处是省事,硬件电路设计更精简。