Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

ALU 的状态标志

复习

  • ALU 根据控制码选择一种算术或逻辑运算
  • 同一组输入在不同控制码下会得到不同结果
  • 结果之外,有些情况还需要额外说明

TL;DR

  • 状态标志是 ALU 对本次结果的简短备注
  • Z、N、C、V 分别描述零、负数、进位和有符号溢出
  • 进位和溢出不是一回事

正文

  假设 ALU 算出 0000。这可能是普通的 0,也可能是固定宽度里绕了一圈才回到 0。只看结果,机器不知道刚才发生了什么。

  所以 ALU 除了交出答案,还会顺手亮起几盏“指示灯”。这些指示灯叫作状态标志

四盏常用的灯

  • Z,零标志:结果是不是全 0
  • N,负数标志:把结果看作补码时,最高位是不是 1
  • C,进位标志:无符号加法有没有从最高位产生进位
  • V,溢出标志:有符号结果是否超出当前位宽能表示的范围

  例如 4 位 ALU 计算 0011 - 0011,结果为 0000,Z 就会变成 1。以后机器要判断“两个数是否相等”,只需做一次减法,再看 Z,不必另造一套比较机器。

进位不等于溢出

  C 和 V 最容易混淆,因为它们都和“装不下”有关,却站在两套解释里。

  4 位无符号数计算:

1111 + 0001 = 1 0000

  低 4 位是 0000,最高位多出一个进位,所以 C = 1。把输入看作无符号数,这是 15 + 1 超出了 0~15。

  再看 4 位有符号补码:

0111 + 0001 = 1000

  +7 + 1 应该得到 +8,可 4 位补码最多只能表示 +7,结果却被解释成 -8,因此 V = 1。这次最高位外面没有进位,C 可以是 0。

  所以:

  • C 关心无符号数有没有向位宽之外进位
  • V 关心有符号数的数学答案是否超出范围

标志有什么用

  状态标志不会替我们决定下一步,但它们给了机器决定的依据:结果为零就停下,结果为负就走另一条路,溢出就报告错误。

  现在,运算结果和对结果的备注都有了。下一章把输入、ALU、控制码和这些标志正式装进一个运算器。

思考题

  在 4 位 ALU 中计算 1111 + 0001。把输入看作无符号数和有符号补码时,各发生了什么?C 和 V 应分别是多少?

小结

知识点

  • Z、N、C、V 四种常见状态标志
  • C 服务于无符号运算
  • V 服务于有符号补码运算
  • 比较可以借助减法结果和状态标志完成

思考题答案(仅供参考)

  结果低 4 位为 0000,并产生最高位进位,所以 C = 1。若按有符号补码解释,1111 是 -1,-1 + 1 = 0 完全在范围内,所以 V = 0;此时 Z = 1。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪