# 2.2 定点数的表示和运算 ## 一、定点数的表示 ### 1.1 什么是定点数 **定点数**: - 小数点位置固定的数 - 分为定点整数和定点小数 **定点整数**: - 小数点固定在最低位之后 - 如:n位定点整数,小数点在最低位右边 **定点小数**: - 小数点固定在符号位之后 - 如:n位定点小数,小数点在符号位右边 ### 1.2 定点整数的表示 **格式**: ``` | 符号位 | 数值位(n-1位) | | 1位 | n-1位 | ``` **范围(补码)**: ``` -2^(n-1) ≤ X ≤ 2^(n-1) - 1 ``` **例子(8位)**: - 最小:10000000 = -128 - 最大:01111111 = 127 ### 1.3 定点小数的表示 **格式**: ``` | 符号位 | 小数位(n-1位) | | 1位 | n-1位 | ``` **范围(补码)**: ``` -1 ≤ X ≤ 1 - 2^-(n-1) ``` **例子(8位)**: - 最小:1.0000000 = -1 - 最大:0.1111111 = 127/128 ≈ 0.992 --- ## 二、定点数的运算 ### 2.1 定点数的移位运算 **算术移位**: - 符号位不变 - 用于乘除2的幂次 **左移**: - 低位补0 - 相当于乘以2 - 可能溢出 **右移**: - 高位补符号位(算术右移) - 相当于除以2 - 可能丢失精度 **例子(8位补码)**: ``` +24 = 00011000 左移1位:00110000 = +48 右移1位:00001100 = +12 -24 = 11101000 左移1位:11010000 = -48 右移1位:11110100 = -12 ``` **逻辑移位**: - 符号位参与移位 - 用于无符号数 - 高位补0 ### 2.2 定点数的加法运算 **补码加法**: ``` [X + Y]补 = [X]补 + [Y]补 ``` **特点**: - 符号位参与运算 - 进位自然丢弃 - 结果仍为补码 **例子(8位)**: ``` +13 = 00001101 +10 = 00001010 ---------------- +23 = 00010111 +13 = 00001101 -10 = 11110110 ---------------- +3 = 00000011(进位丢弃) -13 = 11110011 -10 = 11110110 ---------------- -23 = 11101001(进位丢弃) ``` **溢出判断**: - 正 + 正 = 负:正溢出 - 负 + 负 = 正:负溢出 - 正 + 负:不会溢出 **溢出检测方法**: 1. **单符号位法**: - 结果的符号与操作数符号不同 2. **双符号位法(变形补码)**: - 符号位为00或11:无溢出 - 符号位为01:正溢出 - 符号位为10:负溢出 3. **进位判断法**: - 最高位进位 ⊕ 次高位进位 = 1:溢出 ### 2.3 定点数的减法运算 **补码减法**: ``` [X - Y]补 = [X]补 + [-Y]补 ``` **求[-Y]补**: - 对[Y]补连同符号位取反加1 **例子(8位)**: ``` +13 - (+10) = +13 + (-10) +13 = 00001101 -10 = 11110110 ---------------- +3 = 00000011 +10 - (+13) = +10 + (-13) +10 = 00001010 -13 = 11110011 ---------------- -3 = 11111101 ``` ### 2.4 定点数的乘法运算 #### 原码一位乘法 **方法**: 1. 符号位单独处理(异或) 2. 数值部分绝对值相乘 3. 部分积和乘数联合右移 **步骤**: 1. 初始化:部分积 = 0,乘数 = |Y| 2. 判断乘数末位: - 为1:部分积 + |X| - 为0:部分积 + 0 3. 部分积和乘数联合右移1位 4. 重复n次(n为数值位数) 5. 符号位 = X符号 ⊕ Y符号 **例子**: ``` X = -0.1101, Y = +0.1011 |X| = 0.1101, |Y| = 0.1011 部分积 乘数 操作 00000 1011 末位为1,+|X| +01101 =01101 00110 1101 右移 +01101 末位为1,+|X| =10011 01001 1110 右移 +00000 末位为0,+0 =01001 00100 1111 右移 +01101 末位为1,+|X| =10001 01000 1111 右移 结果:符号位 = 1 ⊕ 0 = 1 乘积 = 1.10001111 ``` #### 补码一位乘法(Booth算法) **方法**: - 符号位参与运算 - 根据乘数末两位判断操作 **操作规则**: | Y_i | Y_{i-1} | 操作 | |-----|---------|------| | 0 | 0 | 右移 | | 0 | 1 | +[X]补,右移 | | 1 | 0 | -[X]补,右移 | | 1 | 1 | 右移 | **步骤**: 1. 初始化:部分积 = 0,乘数 = [Y]补,附加位 = 0 2. 根据末两位判断操作 3. 算术右移 4. 重复n+1次(n为位数) ### 2.5 定点数的除法运算 #### 原码除法(恢复余数法) **方法**: 1. 符号位单独处理(异或) 2. 数值部分绝对值相除 3. 余数左移,减去除数 4. 判断余数符号: - 为正:商1 - 为负:商0,恢复余数(加除数) #### 原码除法(加减交替法) **方法**: 1. 余数为正:商1,余数左移,减除数 2. 余数为负:商0,余数左移,加除数 **优点**: - 不需要恢复余数 - 速度更快 #### 补码除法 **方法**: - 符号位参与运算 - 根据余数和除数的符号判断 --- ## 三、运算器的基本组成 ### 3.1 算术逻辑单元(ALU) **功能**: - 执行算术运算(加、减、乘、除) - 执行逻辑运算(与、或、非、异或) - 执行移位运算 **组成**: - 加法器 - 逻辑运算电路 - 移位器 ### 3.2 加法器 **半加器**: - 两个1位二进制数相加 - 产生和与进位 **全加器**: - 两个1位二进制数加低位进位 - 产生和与进位 **多位加法器**: - 串行加法器:逐位相加,速度慢 - 并行加法器:同时相加,速度快 - 超前进位加法器(CLA):提前计算进位,速度最快 ### 3.3 标志寄存器 **标志位**: - **ZF(Zero Flag)**:零标志,结果为0 - **SF(Sign Flag)**:符号标志,结果为负 - **CF(Carry Flag)**:进位/借位标志 - **OF(Overflow Flag)**:溢出标志 - **PF(Parity Flag)**:奇偶标志 - **AF(Auxiliary Flag)**:辅助进位标志 --- ## 四、考研重点 1. **定点数的表示**: - 定点整数 - 定点小数 - 表示范围 2. **定点数的移位运算**: - 算术移位 - 逻辑移位 - 移位规则 3. **定点数的加法运算**: - 补码加法 - 溢出判断 4. **定点数的减法运算**: - 补码减法 - 求[-Y]补 5. **定点数的乘法运算**: - 原码一位乘法 - 补码一位乘法(Booth算法) 6. **定点数的除法运算**: - 恢复余数法 - 加减交替法 7. **运算器的基本组成**: - ALU - 加法器 - 标志寄存器 --- *下一节:2.3 浮点数的表示和运算*