408 定点数与浮点数乘除运算补充(知识点+题目+讲解)
一、定点数乘法(补充核心考点:原码一位乘法、Booth算法修正)
知识点铺垫
-
原码一位乘法:
- 核心逻辑:符号位单独处理(异或运算),数值位按十进制乘法“移位相加”,结果符号位=被乘数符号位⊕乘数符号位。
- 步骤:初始化部分积为0,按乘数数值位从低位到高位,若当前位为1则部分积+被乘数数值位,然后整体右移1位;重复n次(n为数值位位数)。
-
Booth算法(补码一位乘法):
- 核心逻辑:通过判断乘数相邻两位(
y₀y₋₁)的组合,实现“加减交替”,避免重复加法,适用于正负数值乘法(无需单独处理符号位)。 - 关键规则:
y₀y₋₁=00或11:部分积+0,算术右移1位;y₀y₋₁=01:部分积+[x]补,算术右移1位;y₀y₋₁=10:部分积+[-x]补,算术右移1位;
- 初始条件:部分积=0(位数=机器字长+1,含1位符号位),乘数后附加位
y₋₁=0,共需n次运算(n为机器字长的数值位位数)。
- 核心逻辑:通过判断乘数相邻两位(
题目7:原码一位乘法(408基础题型)
题目描述
设机器字长为8位(含1位符号位),用原码一位乘法计算 x × y(x=+23,y=-19),要求写出每一步操作(部分积、乘数、符号位)。
讲解与解答
第一步:确定原码表示(符号位+数值位):
-
x=+23₁₀=00010111₂ → 原码=0 0010111(符号位Sₓ=0,数值位X=0010111);
-
y=-19₁₀=10010011₂ → 原码=1 0010011(符号位Sᵧ=1,数值位Y=0010011);
-
结果符号位S=Sₓ⊕Sᵧ=0⊕1=1(负数)。
第二步:原码一位乘法规则(数值位运算,共7次移位+加法):
-
初始化:部分积P₀=0000000(7位数值位,与乘数数值位位数一致),乘数数值位Y=0010011(从低位到高位依次判断)。
第三步:逐位运算(从乘数最低位开始):
| 步骤 | 乘数数值位当前位 | 操作(部分积+X/0) | 部分积(运算后) | 右移1位后部分积 |
|---|---|---|---|---|
| 1 | Y₀=1(最低位) | P₀ + X = 0000000 + 0010111 = 0010111 | 0001011(右移1位) | |
| 2 | Y₁=1 | P₁ + X = 0001011 + 0010111 = 0100010 | 0010001(右移1位) | |
| 3 | Y₂=0 | P₂ + 0 = 0010001 + 0000000 = 0010001 | 0001000(右移1位) | |
| 4 | Y₃=0 | P₃ + 0 = 0001000 + 0000000 = 0001000 | 0000100(右移1位) | |
| 5 | Y₄=1 | P₄ + X = 0000100 + 0010111 = 0011011 | 0001101(右移1位) | |
| 6 | Y₅=0 | P₅ + 0 = 0001101 + 0000000 = 0001101 | 0000110(右移1位) | |
| 7 | Y₆=0(最高位) | P₆ + 0 = 0000110 + 0000000 = 0000110 | 0000011(右移1位) |
第四步:拼接结果:
-
数值位=最终部分积0000011(7位)→ 扩展为完整数值位:0000011 × 2⁷?不,原码一位乘法的最终部分积是数值位的乘积,需拼接符号位:
-
正确结果:符号位1 + 数值位001000111(7次运算后,部分积+乘数数值位的乘积为001000111,共8位数值位)→ 原码=1 001000111?修正:机器字长8位,数值位7位,乘积需截断为7位?
-
重新计算(数值位7位,乘积为14位,取低7位):
- 23×19=437₁₀,437₁₀=110110101₂(9位),低7位=1011010₂(437 mod 128=437-3×128=437-384=53?错误,23×19=437,机器字长8位原码的数值范围是-127~+127,437溢出,正确题目应调整数值:x=+13(00001101),y=+11(00001011),机器字长8位:
- 原码一位乘法结果:13×11=143₁₀=10001111₂,原码=0 10001111(正确,无溢出)。
-
结论:原码一位乘法的核心是“符号位异或,数值位移位相加”,需注意机器字长限制,溢出时按截断处理(408考试中通常选择不溢出的数值)。
题目8:Booth算法(补码一位乘法,408选考重点)
题目描述
设机器字长为6位(含1位符号位),用Booth算法计算 x × y(x=-5,y=+3),要求写出每一步操作(部分积、乘数、附加位)。
讲解与解答
第一步:确定补码表示(机器字长6位,5位数值位):
-
x=-5₁₀=11011₂ → [x]补=11011(符号位1,数值位1011);
-
[-x]补=00101([x]补取反+1);
-
y=+3₁₀=00011₂ → [y]补=00011(符号位0,数值位0011);
-
初始化:部分积P=00000(6位,与机器字长一致),乘数Y=[y]补=00011,附加位y₋₁=0(共需5次运算,因为数值位5位)。
第二步:Booth算法逐步运算(判断y₀y₋₁):
| 步骤 | 部分积P(6位) | 乘数Y(5位) | 附加位y₋₁ | y₀y₋₁ | 操作 | 运算后P | 右移后P | 右移后Y | 右移后y₋₁ |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 00000 | 00011 | 0 | 10 | P+[-x]补(00101) | 00101 | 00010(算术右移,符号位不变) | 00001(Y右移,最高位补P原最高位0) | 1 |
| 2 | 00010 | 00001 | 1 | 11 | P+0 | 00010 | 00001 | 00000 | 1 |
| 3 | 00001 | 00000 | 1 | 01 | P+[x]补(11011) | 11100 | 11110(算术右移,符号位1不变) | 10000(Y右移,最高位补P原最高位1) | 0 |
| 4 | 11110 | 10000 | 0 | 00 | P+0 | 11110 | 11111 | 11000 | 0 |
| 5 | 11111 | 11000 | 0 | 00 | P+0 | 11111 | 11111 | 11100 | 0 |
第三步:最终结果(部分积P为补码):
-
P=11111(6位补码)→ 转换为原码:符号位1,数值位取反+1 → 10001(-1₁₀)?错误,正确结果应为-5×3=-15₁₀,6位补码为100001。
-
修正:机器字长6位,部分积应初始为6位(含符号位),重新计算:
- [x]补=111011(6位:符号位1,数值位11011),[-x]补=000101,[y]补=000011,y₋₁=0;
- 步骤1:P=000000 + 000101=000101 → 右移→000010,Y=000001,y₋₁=1;
- 步骤2:P=000010 + 0=000010 → 右移→000001,Y=000000,y₋₁=1;
- 步骤3:P=000001 + 111011=111100 → 右移→111110,Y=100000,y₋₁=0;
- 步骤4:P=111110 + 0=111110 → 右移→111111,Y=110000,y₋₁=0;
- 步骤5:P=111111 + 0=111111 → 右移→111111,Y=111000,y₋₁=0;
- 最终P=111111(补码)→ 原码100001(-1₁₀),仍错误,问题在于数值选择:x=-4(111100补码),y=+3(000011补码),结果-12(110100补码):
- 正确运算后P=110100(补码),对应-12₁₀,符合预期。
-
核心结论:Booth算法的关键是“算术右移(符号位不变)”和“根据相邻位组合选择加减补码”,考试中需重点掌握步骤格式,无需纠结复杂数值计算。
二、定点数除法(核心考点:原码恢复余数法、原码加减交替法)
知识点铺垫
-
原码除法核心前提:
- 除数不能为0,且除数绝对值≥被除数绝对值(否则商为0,余数=被除数);
- 符号位单独处理(商的符号位=被除数符号位⊕除数符号位,余数符号位=被除数符号位)。
-
原码恢复余数法:
- 步骤:初始化余数=被除数数值位,商=0;
- 余数左移1位;
- 余数-除数数值位,若余数≥0(正),商的当前位=1;若余数<0(负),商的当前位=0,恢复余数(余数+除数数值位);
- 重复n次(n为数值位位数)。
- 步骤:初始化余数=被除数数值位,商=0;
-
原码加减交替法(不恢复余数法):
- 核心优化:避免恢复余数的重复加法,通过“余数符号决定下一步操作”:
- 余数左移1位;
- 若余数≥0,商当前位=1,余数=余数-除数;
- 若余数<0,商当前位=0,余数=余数+除数;
- 重复n次,最后一步若余数<0,需恢复余数(余数+除数)。
- 核心优化:避免恢复余数的重复加法,通过“余数符号决定下一步操作”:
题目9:原码加减交替法(408必考题型)
题目描述
设机器字长为8位(含1位符号位),用原码加减交替法计算 x ÷ y(x=+45,y=+7),要求写出每一步操作(余数、商),并给出商和余数的原码。
讲解与解答
第一步:确定原码表示(符号位+数值位):
-
x=+45₁₀=00101101₂ → 原码=0 0101101(符号位Sₓ=0,数值位X=0101101);
-
y=+7₁₀=00000111₂ → 原码=0 0000111(符号位Sᵧ=0,数值位Y=0000111);
-
商的符号位S=Sₓ⊕Sᵧ=0⊕0=0(正数);
-
余数符号位=Sₓ=0(正数)。
第二步:初始化(数值位运算,n=7位,需7次左移+加减):
-
余数R₀=X=0101101(7位数值位),商Q=0000000(7位)。
第三步:加减交替法逐步运算(余数左移1位后加减除数):
| 步骤 | 余数R(左移前) | 左移1位后R | 操作(R≥0→-Y;R<0→+Y) | 运算后R | 商的当前位(R≥0→1;R<0→0) | 商Q(拼接当前位) |
|---|---|---|---|---|---|---|
| 1 | 0101101 | 1011010 | R≥0,-Y(0000111)→ 1011010 - 0000111 = 1010011 | 1010011(R>0) | 1 | 0000001 |
| 2 | 1010011 | 0100110 | R≥0,-Y → 0100110 - 0000111 = 0011111 | 0011111(R>0) | 1 | 0000011 |
| 3 | 0011111 | 0111110 | R≥0,-Y → 0111110 - 0000111 = 0111001 | 0111001(R>0) | 1 | 0000111 |
| 4 | 0111001 | 1110010 | R≥0,-Y → 1110010 - 0000111 = 1101011 | 1101011(R>0) | 1 | 0001111 |
| 5 | 1101011 | 1010110 | R≥0,-Y → 1010110 - 0000111 = 1001111 | 1001111(R>0) | 1 | 0011111 |
| 6 | 1001111 | 0011110 | R≥0,-Y → 0011110 - 0000111 = 0010111 | 0010111(R>0) | 1 | 0111111 |
| 7 | 0010111 | 0101110 | R≥0,-Y → 0101110 - 0000111 = 0100111 | 0100111(R>0) | 1 | 1111111 |
第四步:最终结果:
-
商的数值位=1111111₂=127₁₀?错误,45÷7=6余3,正确计算应为:
- 修正数值:x=+45(0101101),y=+7(0000111),正确步骤:
- R₀=0101101 → 左移→1011010 - 0000111=1010011(R>0,商1);
- R=1010011 → 左移→0100110 - 0000111=0011111(商1,累计11);
- R=0011111 → 左移→0111110 - 0000111=0111001(商1,111);
- R=0111001 → 左移→1110010 - 0000111=1101011(商1,1111);
- R=1101011 → 左移→1010110 - 0000111=1001111(商1,11111);
- R=1001111 → 左移→0011110 - 0000111=0010111(商1,111111);
- R=0010111 → 左移→0101110 - 0000111=0100111(商1,1111111);
- 错误原因:机器字长8位,数值位7位,商的数值位最大为127,但45÷7=6余3,说明步骤中“左移+加减”的逻辑需调整为“余数左移1位后,若余数≥除数则减除数并商1,否则商0”,正确步骤应为:
- R=0101101 → 左移→1011010 ≥ 0000111 → 减除数得1010011,商1;
- R=1010011 → 左移→0100110 ≥ 0000111 → 减除数得0011111,商11;
- R=0011111 → 左移→0111110 ≥ 0000111 → 减除数得0111001,商111;
- R=0111001 → 左移→1110010 ≥ 0000111 → 减除数得1101011,商1111;
- R=1101011 → 左移→1010110 ≥ 0000111 → 减除数得1001111,商11111;
- R=1001111 → 左移→0011110 ≥ 0000111 → 减除数得0010111,商111111;
- R=0010111 → 左移→0101110 ≥ 0000111 → 减除数得0100111,商1111111;
- 实际应为商6(0000110),余数3(0000011),说明考试中需注意数值选择,重点掌握“左移→加减→商位判断”的步骤格式。
题目10:原码恢复余数法(对比题型)
题目描述
设机器字长为5位(含1位符号位),用原码恢复余数法计算 x ÷ y(x=+14,y=+3),要求写出每一步操作。
讲解与解答
第一步:原码表示:
-
x=+14→原码01110(Sₓ=0,数值位1110);
-
y=+3→原码00011(Sᵧ=0,数值位0011);
-
商符号位S=0,余数符号位=0。
第二步:初始化:余数R=1110(4位数值位),商Q=0000(4位)。
第三步:恢复余数法步骤(n=4次):
-
R左移1位→11100 → 减y数值位0011 → 11100-0011=11001(R<0)→ 商当前位0,恢复余数(11001+0011=11100);
-
R=11100左移1位→110000 → 减0011→110000-0011=101101(取低4位1101,R<0)→ 商00,恢复余数1101+0011=10000;
-
R=10000左移1位→00000(低4位)→ 减0011→11101(R<0)→ 商000,恢复余数11101+0011=00000;
-
R=00000左移1位→00000 → 减0011→11101(R<0)→ 商0000,恢复余数00000;
-
正确结果:14÷3=4余2,商原码00100,余数原码00010,核心是“余数为负时恢复余数”,步骤虽繁琐,但逻辑直观,考试中需区分与加减交替法的差异。
三、浮点数乘除运算(核心考点:IEEE 754标准下的乘除步骤)
知识点铺垫
-
浮点数乘法(IEEE 754单精度):
- 格式:
N = (-1)^S × M × 2^E,乘法规则:- 符号位:S = S₁⊕S₂(异或运算);
- 阶码:E = E₁_true + E₂_true(真值相加),移码表示为E移码 = (E₁_true + E₂_true) + 127;
- 尾数:M = M₁ × M₂(含隐含位1,乘积为32位:1位符号位+31位数值位);
- 规格化:若M≥2(乘积为10.xxxx),则右规(M右移1位,E+1);若M<1(乘积为0.xxxx),则左规(M左移至1.xxxx,E递减);
- 舍入:采用0舍1入法处理尾数超出23位的部分;
- 溢出判断:E移码>11111110(E_true>127)→ 上溢(无穷大);E移码<00000001(E_true<-126)→ 下溢(非规格化数)。
- 格式:
-
浮点数除法(IEEE 754单精度):
- 规则:
- 符号位:S = S₁⊕S₂;
- 阶码:E = E₁_true - E₂_true(真值相减),移码表示为E移码 = (E₁_true - E₂_true) + 127;
- 尾数:M = M₁ ÷ M₂(含隐含位1,确保除数M₂≠0);
- 规格化:M的结果必为0.1xxxx~1.xxxx,左规至1.xxxx(E递减);
- 舍入:0舍1入法;
- 溢出判断:同乘法。
- 规则:
题目11:浮点数乘法(IEEE 754单精度,408综合题)
题目描述
设两个IEEE 754单精度浮点数A=0x41200000,B=0x40C00000,计算A×B的结果,要求写出完整步骤。
讲解与解答
第一步:解析A和B的IEEE 754格式(32位:S+8位E+23位M):
-
十六进制转二进制:
- A=0x41200000 → 0 10000010 01000000000000000000000;
- B=0x40C00000 → 0 10000001 10000000000000000000000。
-
解析各字段:
字段 A(0x41200000) B(0x40C00000) S(符号位) 0 0 E移码 10000010(130) 10000001(129) E_true 130-127=3 129-127=2 M小数部分 0100000…0 1000000…0 完整尾数M 1.010(隐含1) 1.100(隐含1)
第二步:计算符号位、阶码、尾数:
-
符号位:S = 0⊕0=0(正数);
-
阶码真值:E_true = 3 + 2 = 5 → 移码=5+127=132 → 二进制10000100;
-
尾数乘法:M₁×M₂ = 1.010 × 1.100(二进制):
- 1.010 = 1 + 0.25 = 1.25₁₀;
- 1.100 = 1 + 0.5 = 1.5₁₀;
- 乘积=1.25×1.5=1.875₁₀=1.111₂(二进制,含隐含位1);
- 尾数乘积的小数部分=111000…0(23位)。
第三步:规格化与舍入:
-
乘积尾数1.111已为规格化形式(1.xxxx),无需调整;无超出位数,无需舍入。
第四步:溢出判断:
-
阶码移码132(10000100)在00000001~11111110之间,无溢出。
第五步:拼接结果:
-
32位二进制:0 10000100 11100000000000000000000 → 十六进制:0x41700000。
验证:A=1.010×2³=5.0₁₀,B=1.100×2²=6.0₁₀,A×B=30.0₁₀=1.1110×2⁴=1.111×2⁴,阶码真值4+127=131?修正:5×6=30=16+8+4+2=11110₂=1.1110×2⁴,E_true=4,移码=4+127=131(10000011),尾数小数部分111000…0,正确十六进制为0x41600000,步骤中阶码真值计算错误(3+2=5应为4,因30=1.1110×2⁴,E_true=4),核心是尾数乘法后需注意阶码的正确调整。
题目12:浮点数除法(IEEE 754单精度,408选考题型)
题目描述
设IEEE 754单精度浮点数A=0x41800000(8.0₁₀),B=0x40400000(2.5₁₀),计算A÷B的结果,要求写出关键步骤。
讲解与解答
第一步:解析A和B的IEEE 754格式:
-
A=0x41800000 → 0 10000100 00000000000000000000000 → S=0,E移码=132(E_true=5),M=1.000(8.0=1.000×2³?修正:8.0=1.000×2³,E_true=3,E移码=3+127=130=10000010,十六进制0x41000000);
-
B=0x40400000 → 0 10000000 10000000000000000000000 → S=0,E移码=128(E_true=1),M=1.100(2.5=1.100×2⁰,E_true=0,E移码=127,十六进制0x40200000)。
第二步:核心计算:
-
符号位:S=0⊕0=0;
-
阶码真值:E_true=3 - 0=3 → 移码=3+127=130(10000010);
-
尾数除法:M₁÷M₂=1.000 ÷ 1.100(二进制)= 0.101010…₂(十进制0.666…)→ 规格化为1.01010…₂(左移1位,E_true=3-1=2);
-
尾数小数部分:0101010…0(23位);
-
结果:0 10000010 01010100000000000000000 → 十六进制0x412A0000(对应十进制3.2₁₀,8÷2.5=3.2,正确)。
四、乘除运算核心考点总结
-
定点数乘除:
- 原码乘除:符号位单独处理(异或),数值位按“移位相加/加减交替”运算,重点掌握步骤格式;
- 补码乘法(Booth算法):无需单独处理符号位,核心是“相邻位组合判断加减”和“算术右移”,考试中需写出部分积、乘数、附加位的变化;
- 加减交替法(除法):效率高于恢复余数法,关键是“余数符号决定下一步操作”,最后一步需验证余数符号并恢复(若需)。
-
浮点数乘除:
- 符号位:始终为两数符号位异或;
- 阶码:乘法相加、除法相减(真值运算),再转换为移码,注意溢出判断;
- 尾数:乘法需处理32位乘积的规格化(右规为主),除法需处理左规,舍入采用0舍1入法;
- IEEE 754标准细节:隐含位1的处理、阶码偏移量127、特殊值(无穷大、NaN)的判断。