逻辑移位

  • 操作对象无符号数

  • 核心规则:空位统一补 0

  • 左移:高位移除,低位补 0(等价于乘 2ⁿ,无溢出时)

  • 右移:低位移除,高位补 0(等价于除 2ⁿ,向下取整)

  • 典型应用:位掩码生成、无符号数快速乘除

算术移位

  • 操作对象:有符号数(多为补码

  • 核心规则:保留符号位,空位按符号填

  • 左移:符号位不动,只移动数值位,高位移除,低位补 0(可能溢出,等价于乘 2ⁿ)

  • 右移:符号位不动,只移动数值位,低位移除,高位补符号位(等价于除 2ⁿ,向下取整)

  • 典型应用:有符号数快速乘除、CPU ALU 定点数运算

循环移位

  • 核心特点:移出位填入空位,不丢位

  • 类型与规则

  • 不带CF进位:纯循环,移出位直接填空位(左移填低位,右移填高位),溢出位填入CF位

  • 带CF进位:结合进位位 CF,移出位存 CF,CF 填空位

  • 典型应用:数据加密、多字节拼接、校验码生成(如 CRC)

image-20251108134554109

补码加减法

一、补码核心优势

  • 符号位与数值位可一同运算
  • 减法可转化为加法,规则简单、易于实现

二、运算公式与模数

1. 核心公式
  • 加法:[A] 补 + [B] 补 = [A+B] 补
  • 减法:[A-B] 补 = [A+(-B)] 补 = [A] 补 + [-B] 补
2. 运算模数
  • 定点整数:模数 = 2^(N+1)(N 为补码数值位位数)
  • 定点小数:模数 = 2

补码加减溢出检测

1:根据操作数的符号位与运算结果的符号位是否一致进行判断

由于采用补码可将减法运算转换成加法运算,因此不论作加法还是是减法,只要实际参加运算的两个操作数符号相
同,但运算结果的符号位与原操数不同,即为溢出。

2:根据运算过程中最高数值位的进位与符号位的进位是否一致进行判断

不同可判定为产生溢出,相同可判定为没有产生溢出。

image-20251108145448102 image-20251108145621096

3:利用变形补码 (具有 2 位符号位的补码) 的符号位进行判断

变形补码也称为双符号补码,具有 2 个符号位,其余与补码相同

双符号位为 00 时,表示正数;

双符号位为 11 时,表示负数;

双符号位为 01 时,表示正溢出;

双符号位为 10 时,表示负溢出;

溢出判断非常直观,适合手工运算时的溢出检测,但其硬件成本高,在计算机中主要采用单符号溢出检测方案。

注意:负数变形补码转换成原码仍可以使用反码法或扫描法

无符号数乘法实现

image-20251108155955589 image-20251108160546596

有符号数的乘法实现

原码

对于定点整数原码乘法,其过程与定点小数原码乘法完全相同,仅将符号位与数值位之间的小数点改为逗号即可

原码乘法和补码乘法详解

1. 原码乘法(一正一负容易出错,常用于教学)

原码表示

  • 符号位 + 绝对值
  • 正数:0.xxxxxx
  • 负数:1.xxxxxx(xxxxxx是真值的绝对值)

原码乘法规则

  1. 符号位单独计算:符号位相乘(0×0=0正,0×1=1负,1×1=0正),即“异号得负,同号得正”。
  2. 绝对值相乘:两个数的绝对值用无符号二进制乘法计算(类似十进制手工乘法)。
  3. 结果:符号位 + 绝对值乘积(小数点位置不变)。
  4. 通常用双符号位(00或11)参与运算,最后根据双符号位判断并修正(如果出现01或10,表示溢出或错误)。

手工计算步骤(绝对值部分):

  • 被乘数写一行。
  • 乘数从低位到高位,每位如果是1,就把被乘数左移相应位数加到部分积。
  • 所有部分积相加得到绝对值积。
  • 小数点始终对齐在同一位置。

例子
X = +0.1101(原码:0.1101)
Y = -0.1011(原码:1.1011)

  • 符号:0 × 1 = 1(结果负)
  • 绝对值:0.1101 × 0.1011
1
2
3
4
5
6
7
8
9
   0.1101
× 0.1011
----------
0.1101 (×1,低位)
0.1101 (×1,左移1位)
0.0000 (×0,左移2位)
0.1101 (×1,左移3位)
----------------
0.10001111 (绝对值积)
  • 结果原码:1.10001111(即 -0.10001111)

缺点:负数参与时绝对值取反麻烦,容易出错;硬件实现复杂(需要先取绝对值)。

除法

恢复余数法

image-20251108192217685
原码除法的法则
  1. 前提条件:
    • 除数 不等于 0
    • 定点小数:∣ 被除数 ∣ < ∣ 除数 ∣
    • 定点整数:∣ 被除数 ∣ ≥ ∣ 除数 ∣
  2. 商的符号 = 被除数的符号 ⊕ 除数的符号
  3. ∣=∣ 被除数 ∣÷∣ 除数 ∣
  4. 将商的符号与 ∣∣ 拼接在一起
image-20251108192730692

不恢复除数法

image-20251108201757157

首先,判断这个数是正的还是负的

然后,左移这个数

最后,根据刚开始的判断,看是加还是减 $y$

浮点加减法运算

五步运算流程对阶、尾数加减、规格化、舍入、溢出判断

  • 对阶

    • 小阶向大阶看齐,尾数右移相应位数(两个阶的差的绝对值)(算数右移=符号位不动,只移动数值位,低位保留作为保留附加位高位补符号位

    • 移出位暂时保留,称为保留附加位。保留附加位参与中间运算算以提高运算精度:

    • 尾数运算结束,结果规格化后再进行舍入。

  • 尾数加减:将尾数按位运算加减,此时表示的不是规格化的尾数,所以需要规格化

  • 规格化

    • 目的:使尾数满足 0.1≤∣M∣<1(二进制),保证表示精度。
    • 双符号补码下的规格化判断:
      • 正数:尾数形式为 00.1bbb(符号位 “00”,最高数值位为 “1”)。
      • 负数:尾数形式为 11.0bbb(符号位 “11”,最高数值位为 “0”,但绝对值满足范围)。
    • 左规
      • 触发条件:尾数为 11.1bbb(负,绝对值 < 0.1)或 00.0bbb(正,绝对值 < 0.1),即最高数值位为 0。
      • 操作:尾数每左移 1 位,阶码减 1,直到尾数规格化。
      • 溢出判断:若阶码双符号位为 10,表示下溢,结果视为 0。
    • 右规
      • 触发条件:尾数为 10.bbb 或 01.bbb,即尾数运算溢出(双符号位不同)。
      • 操作:尾数右移 1 位,阶码加 1
      • 溢出判断:若阶码双符号位为 01,表示上溢,结果视为∞。
  • 舍入

    • 触发场景:对阶或规格化过程中尾数低位被舍弃,产生精度误差。
    • 方法:
      • 截断法:直接丢弃低位,误差积累大。
      • 末尾恒置 1 法:将机器字长内尾数的最低位置 1,误差积累小。
      • 零舍一入法:类似十进制四舍五入,误差最小但操作复杂,可能破坏规格化(需重新规格化)。
  • 溢出判断

    • 阶码溢出:通过双符号位判断(上溢为 01,下溢为 10),分别对应结果为∞或 0。
    • 尾数溢出:右规可修正,不属于最终运算溢出。

变形补码(双符号位补码)运算知识点总结

一、基本概念

  1. 变形补码定义
    • 用两个符号位表示数的符号(模4补码)
    • 正数:符号位为 00
    • 负数:符号位为 11
    • 用于检测运算溢出
  2. 表示范围
    • 对于n位数值位,表示范围为:[-1, 1-2⁻ⁿ)
    • 例:5位小数位,范围为[-1, 0.11111]即[-1, 0.96875]
  3. 与单符号位补码的关系
    • 正数:在单符号位补码前加0 → 0.xxxxx00.xxxxx
    • 负数:在单符号位补码前加1 → 1.xxxxx11.xxxxx

二、编码规则

  1. 正数变形补码
    • 符号位:00
    • 数值位:保持原码
    • 例:+0.11011 → 00.11011
  2. 负数变形补码
    • 方法1:先求单符号位补码,再扩展符号位
      • 绝对值取反加1得数值位补码
      • 加符号位1,再扩展为双符号位
    • 方法2:直接计算 4 + X(模4)取小数部分
    • 例:-0.10101 → 单符号位补码:1.01011 → 变形补码:11.01011

三、运算规则

  1. 加法运算
    • 两个变形补码直接相加(包括符号位)
    • 模2运算,但实际是模4(因为双符号位)
    • 最高位的进位丢弃
  2. 溢出判断
    • 无溢出:符号位为 00(正数)或 11(负数)
    • 正溢出:符号位为 01(结果>最大正数)
    • 负溢出:符号位为 10(结果<最小负数)
    • 关键:符号位两位不同即表示溢出