数据在计算机中的表示主要分为两大类:定点数和浮点数。本篇主要是定点数在计算机中表示与运算的一个小结
1. 机器数定点表示。
定点数表述约定机器数中小数点的位置固定不变
定点小数(纯小数)
小数点的位置固定在最高位之前。 --> 0.XXX
定点整数(纯整数)
小数点的位置固定在最低位之后。 --> XXX.0
2. 原码补码反码移码
原码
用机器数的最高位表示该数的符号,其余各位表示数的绝对值。
补码 (纯小数)
[x]补={x1>x≥02+x=2−∣x∣0>x≥−1 [x]_补 = \begin{cases} x & 1>x\geq0 \\ 2+x = 2-\vert x\vert &0>x\geq-1\\ \end{cases} [x]补={x2+x=2−∣x∣1>x≥00>x≥−1
补码 (纯整数)
[x]补={0.x2n>x≥02n+1+x=2n+1−∣x∣0>x≥−2n [x]_补 = \begin{cases} 0.x & 2^n>x\geq0 \\ 2^{n+1}+x = 2^{n+1}-\vert x\vert &0>x\geq-2^n\\ \end{cases} [x]补={0.x2n+1+x=2n+1−∣x∣2n>x≥00>x≥−2n
反码
用机器数的最高位表示该数的符号,其余各位表示数的绝对值。
移码
[x]移=2n+x(2n>x≥−2n)(机器字长为n+1) [x]_移 = 2^n+x (2^n>x\geq-2^n)(机器字长为n+1) [x]移=2n+x(2n>x≥−2n)(机器字长为n+1)
3. 移位运算
逻辑移位
将操作数视为无符号数。逻辑左移时,高位移丢,低位添0;逻辑右移时,低位移丢,高位添0。
算术移位
对象是有符号数,在移位过程中符号位保持不变。
空位添补规则:
| 码制 | 填补代码 | |
|---|---|---|
| 正数 | 原码、补码、反码 | 0 |
| 原码 | 0 | |
| 负数 | 补码 | 左移添0、右移添1 |
| 反码 | 1 |
4. 原码定点数加减法(略)
5. 补码定点数加减法
补码加减法运算规则简单,易于实现,因此计算机系统中普遍采用补码加减运算。
符号位与数值位按照相同的规则参与运算,运算产生的进位舍弃
[A+B]补=[A]补+[B]补(modM)[A−B]补=[A]补+[−B]补(modM)
[A+B]_补 = [A]_补+[B]_补 (mod M)\\
[A-B]_补 = [A]_补+[-B]_补 (mod M)
[A+B]补=[A]补+[B]补(modM)[A−B]补=[A]补+[−B]补(modM)
6. 溢出
仅当两个符号相同的数相加或两个符号相异的数相减才可能产生溢出
- 一位符号位:参加操作的两个数符号相同,结果又与原操作数符号不同,表示结果溢出。
- 双符号位:运算结果的两个符号位相同,表示未溢出;符号位不同,表示结果溢出。
进位/借位标识CF:用于无符号数加减法
溢出标识OF:用于有符号数加减法
7. 原码一位乘法
[X]原=xs.x1x2⋯xn;[Y]原=ys.y1y2⋯yn. [X]_原=x_s.x_1x_2\cdots x_n; \\ [Y]_原=y_s.y_1y_2\cdots y_n . [X]原=xs.x1x2⋯xn;[Y]原=ys.y1y2⋯yn.
1.被乘数和乘数均以绝对值参与运算,符号位:xs⨁ys;2.部分积的长度和被乘数长度相同,取n+1位;3.从乘数最低位yn开始判断{若yn=1,部分积加上被乘数∣x∣若yn=0,部分积加0}然后右移一位;4.重复步骤3,判断n次。 \begin{aligned} &1. 被乘数和乘数均以绝对值参与运算,符号位: x_s\bigoplus y_s; \\ &2. 部分积的长度和被乘数长度相同,取n+1位;\\ &3. 从乘数最低位y_n开始判断 \begin{Bmatrix} 若y_n=1,部分积加上被乘数\vert x\vert \\ 若y_n=0,部分积加0 \end {Bmatrix}然后右移一位;\\ &4. 重复步骤3,判断n次。 \end{aligned} 1.被乘数和乘数均以绝对值参与运算,符号位:xs⨁ys;2.部分积的长度和被乘数长度相同,取n+1位;3.从乘数最低位yn开始判断{若yn=1,部分积加上被乘数∣x∣若yn=0,部分积加0}然后右移一位;4.重复步骤3,判断n次。
8. 补码一位乘法(Booth)
[X]补=xs.x1x2⋯xn;[Y]补=ys.y1y2⋯yn. [X]_补=x_s.x_1x_2\cdots x_n; \\ [Y]_补=y_s.y_1y_2\cdots y_n . [X]补=xs.x1x2⋯xn;[Y]补=ys.y1y2⋯yn.
1.符号位参与运算,运算的结果均以补码表示;2.被乘数一般取双符号位参与运算,部分积取双符号位,初值为0,乘数可取单符号位;3.乘数末位增设附加位yn+1,且初值为0;4.根据(yn,yn+1)的取值确定操作:yn={0,yn+1={0⇒部分积右移一位;1⇒部分积加[X]补,右移一位1,yn+1={0⇒部分积加[−X]补,右移一位1⇒部分积右移一位5.移位按补码右移规则进行;6.按上述算法操作n+1次,但第n+1次不移位,仅根据yn,yn+1的结果作相应运算。 \begin{aligned} & 1.符号位参与运算,运算的结果均以补码表示;\\ & 2.被乘数一般取双符号位参与运算,部分积取双符号位,初值为0,乘数可取单符号位; \\ & 3.乘数末位增设附加位y_{n+1},且初值为0; \\ & 4.根据(y_n,y_n+1)的取值确定操作: y_n = \begin{cases} 0 , y_{n+1} = \begin{cases} 0 \Rightarrow 部分积右移一位;\\ 1 \Rightarrow 部分积加[X]_补,右移一位\\ \end{cases} \\ 1 , y_{n+1} = \begin{cases} 0 \Rightarrow 部分积加[-X]_补,右移一位\\ 1 \Rightarrow 部分积右移一位 \end{cases}\\ \end{cases}\\ & 5.移位按补码右移规则进行;\\ & 6.按上述算法操作n+1次,但第n+1次不移位,仅根据y_n,y_{n+1}的结果作相应运算。 \end{aligned} 1.符号位参与运算,运算的结果均以补码表示;2.被乘数一般取双符号位参与运算,部分积取双符号位,初值为0,乘数可取单符号位;3.乘数末位增设附加位yn+1,且初值为0;4.根据(yn,yn+1)的取值确定操作:yn=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧0,yn+1={0⇒部分积右移一位;1⇒部分积加[X]补,右移一位1,yn+1={0⇒部分积加[−X]补,右移一位1⇒部分积右移一位5.移位按补码右移规则进行;6.按上述算法操作n+1次,但第n+1次不移位,仅根据yn,yn+1的结果作相应运算。
9. 原码除法运算(不恢复余数法)
[X]原=xs.x1x2⋯xn;[Y]原=ys.y1y2⋯yn. [X]_原=x_s.x_1x_2\cdots x_n; \\ [Y]_原=y_s.y_1y_2\cdots y_n . [X]原=xs.x1x2⋯xn;[Y]原=ys.y1y2⋯yn.
1.商的符号:Qs=xs⨁ys;2.先用被除数减去余数∣X∣−∣Y∣=∣X∣+(−∣Y∣)=∣X∣+[−∣Y∣]补,当余数为正时,商上1,余数和商左移一位;当余数为负时,商上0,余数和商左移一位,再加上余数;3.当n+1步余数为负时,需加上∣Y∣得到第n+1步正确的余数(余数与被除数应该同号)。 \begin{aligned} & 1.商的符号: Q_s = x_s \bigoplus y_s;\\ & 2.先用被除数减去余数\vert X\vert - \vert Y\vert = \vert X\vert + (-\vert Y\vert)=\vert X\vert+[-\vert Y\vert]_补,\\ & 当余数为正时,商上1,余数和商左移一位;当余数为负时,商上0,余数和商左移一位,再加上余数;\\ & 3.当n+1步余数为负时,需加上\vert Y\vert得到第n+1步正确的余数(余数与被除数应该同号)。 \end{aligned} 1.商的符号:Qs=xs⨁ys;2.先用被除数减去余数∣X∣−∣Y∣=∣X∣+(−∣Y∣)=∣X∣+[−∣Y∣]补,当余数为正时,商上1,余数和商左移一位;当余数为负时,商上0,余数和商左移一位,再加上余数;3.当n+1步余数为负时,需加上∣Y∣得到第n+1步正确的余数(余数与被除数应该同号)。
本文介绍了计算机中定点数的表示,包括定点小数和整数,以及原码、补码、反码和移码的概念。详细讲解了补码定点数的加减法、移位运算,尤其是补码一位乘法的Booth算法和原码除法的不恢复余数法。重点讨论了溢出判断和符号位处理。

3395

被折叠的 条评论
为什么被折叠?



