定点数与浮点数的乘除计算

408 定点数与浮点数乘除运算补充(知识点+题目+讲解)

一、定点数乘法(补充核心考点:原码一位乘法、Booth算法修正)

知识点铺垫

  1. 原码一位乘法

    • 核心逻辑:符号位单独处理(异或运算),数值位按十进制乘法“移位相加”,结果符号位=被乘数符号位⊕乘数符号位。
    • 步骤:初始化部分积为0,按乘数数值位从低位到高位,若当前位为1则部分积+被乘数数值位,然后整体右移1位;重复n次(n为数值位位数)。
  2. Booth算法(补码一位乘法)

    • 核心逻辑:通过判断乘数相邻两位(y₀y₋₁)的组合,实现“加减交替”,避免重复加法,适用于正负数值乘法(无需单独处理符号位)。
    • 关键规则:
      • y₀y₋₁=0011:部分积+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算法的关键是“算术右移(符号位不变)”和“根据相邻位组合选择加减补码”,考试中需重点掌握步骤格式,无需纠结复杂数值计算。

二、定点数除法(核心考点:原码恢复余数法、原码加减交替法)

知识点铺垫

  1. 原码除法核心前提

    • 除数不能为0,且除数绝对值≥被除数绝对值(否则商为0,余数=被除数);
    • 符号位单独处理(商的符号位=被除数符号位⊕除数符号位,余数符号位=被除数符号位)。
  2. 原码恢复余数法

    • 步骤:初始化余数=被除数数值位,商=0;
      1. 余数左移1位;
      2. 余数-除数数值位,若余数≥0(正),商的当前位=1;若余数<0(负),商的当前位=0,恢复余数(余数+除数数值位);
      3. 重复n次(n为数值位位数)。
  3. 原码加减交替法(不恢复余数法)

    • 核心优化:避免恢复余数的重复加法,通过“余数符号决定下一步操作”:
      1. 余数左移1位;
      2. 若余数≥0,商当前位=1,余数=余数-除数;
      3. 若余数<0,商当前位=0,余数=余数+除数;
      4. 重复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),正确步骤:
    1. R₀=0101101 → 左移→1011010 - 0000111=1010011(R>0,商1);
    2. R=1010011 → 左移→0100110 - 0000111=0011111(商1,累计11);
    3. R=0011111 → 左移→0111110 - 0000111=0111001(商1,111);
    4. R=0111001 → 左移→1110010 - 0000111=1101011(商1,1111);
    5. R=1101011 → 左移→1010110 - 0000111=1001111(商1,11111);
    6. R=1001111 → 左移→0011110 - 0000111=0010111(商1,111111);
    7. R=0010111 → 左移→0101110 - 0000111=0100111(商1,1111111);
    • 错误原因:机器字长8位,数值位7位,商的数值位最大为127,但45÷7=6余3,说明步骤中“左移+加减”的逻辑需调整为“余数左移1位后,若余数≥除数则减除数并商1,否则商0”,正确步骤应为:
    1. R=0101101 → 左移→1011010 ≥ 0000111 → 减除数得1010011,商1;
    2. R=1010011 → 左移→0100110 ≥ 0000111 → 减除数得0011111,商11;
    3. R=0011111 → 左移→0111110 ≥ 0000111 → 减除数得0111001,商111;
    4. R=0111001 → 左移→1110010 ≥ 0000111 → 减除数得1101011,商1111;
    5. R=1101011 → 左移→1010110 ≥ 0000111 → 减除数得1001111,商11111;
    6. R=1001111 → 左移→0011110 ≥ 0000111 → 减除数得0010111,商111111;
    7. 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次):

  1. R左移1位→11100 → 减y数值位0011 → 11100-0011=11001(R<0)→ 商当前位0,恢复余数(11001+0011=11100);

  2. R=11100左移1位→110000 → 减0011→110000-0011=101101(取低4位1101,R<0)→ 商00,恢复余数1101+0011=10000;

  3. R=10000左移1位→00000(低4位)→ 减0011→11101(R<0)→ 商000,恢复余数11101+0011=00000;

  4. R=00000左移1位→00000 → 减0011→11101(R<0)→ 商0000,恢复余数00000;

  • 正确结果:14÷3=4余2,商原码00100,余数原码00010,核心是“余数为负时恢复余数”,步骤虽繁琐,但逻辑直观,考试中需区分与加减交替法的差异。

三、浮点数乘除运算(核心考点:IEEE 754标准下的乘除步骤)

知识点铺垫

  1. 浮点数乘法(IEEE 754单精度)

    • 格式:N = (-1)^S × M × 2^E,乘法规则:
      1. 符号位:S = S₁⊕S₂(异或运算);
      2. 阶码:E = E₁_true + E₂_true(真值相加),移码表示为E移码 = (E₁_true + E₂_true) + 127;
      3. 尾数:M = M₁ × M₂(含隐含位1,乘积为32位:1位符号位+31位数值位);
      4. 规格化:若M≥2(乘积为10.xxxx),则右规(M右移1位,E+1);若M<1(乘积为0.xxxx),则左规(M左移至1.xxxx,E递减);
      5. 舍入:采用0舍1入法处理尾数超出23位的部分;
      6. 溢出判断:E移码>11111110(E_true>127)→ 上溢(无穷大);E移码<00000001(E_true<-126)→ 下溢(非规格化数)。
  2. 浮点数除法(IEEE 754单精度)

    • 规则:
      1. 符号位:S = S₁⊕S₂;
      2. 阶码:E = E₁_true - E₂_true(真值相减),移码表示为E移码 = (E₁_true - E₂_true) + 127;
      3. 尾数:M = M₁ ÷ M₂(含隐含位1,确保除数M₂≠0);
      4. 规格化:M的结果必为0.1xxxx~1.xxxx,左规至1.xxxx(E递减);
      5. 舍入:0舍1入法;
      6. 溢出判断:同乘法。

题目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)

第二步:计算符号位、阶码、尾数:

  1. 符号位:S = 0⊕0=0(正数);

  2. 阶码真值:E_true = 3 + 2 = 5 → 移码=5+127=132 → 二进制10000100;

  3. 尾数乘法: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)。

第二步:核心计算:

  1. 符号位:S=0⊕0=0;

  2. 阶码真值:E_true=3 - 0=3 → 移码=3+127=130(10000010);

  3. 尾数除法:M₁÷M₂=1.000 ÷ 1.100(二进制)= 0.101010…₂(十进制0.666…)→ 规格化为1.01010…₂(左移1位,E_true=3-1=2);

  4. 尾数小数部分:0101010…0(23位);

  5. 结果:0 10000010 01010100000000000000000 → 十六进制0x412A0000(对应十进制3.2₁₀,8÷2.5=3.2,正确)。

四、乘除运算核心考点总结

  1. 定点数乘除

    • 原码乘除:符号位单独处理(异或),数值位按“移位相加/加减交替”运算,重点掌握步骤格式;
    • 补码乘法(Booth算法):无需单独处理符号位,核心是“相邻位组合判断加减”和“算术右移”,考试中需写出部分积、乘数、附加位的变化;
    • 加减交替法(除法):效率高于恢复余数法,关键是“余数符号决定下一步操作”,最后一步需验证余数符号并恢复(若需)。
  2. 浮点数乘除

    • 符号位:始终为两数符号位异或;
    • 阶码:乘法相加、除法相减(真值运算),再转换为移码,注意溢出判断;
    • 尾数:乘法需处理32位乘积的规格化(右规为主),除法需处理左规,舍入采用0舍1入法;
    • IEEE 754标准细节:隐含位1的处理、阶码偏移量127、特殊值(无穷大、NaN)的判断。