8 / 37 · 概念
二进制补码、符号扩展与溢出
用公式与反例区分位串的 signed 解释及加法溢出条件。
课时内容可免费阅读,选课后可保存学习进度。
最高位的权重发生变化
位二进制补码二进制补码 用固定位宽位串表示有符号整数的方法。n 位范围为 −2^(n−1) 到 2^(n−1)−1。整数按下式解释。
四位 1010 按 unsignedunsigned 将位串解释为非负整数的规则。n 位范围为 0 到 2^n−1,可能与同一位串的 signed 解释不同。了解更多 解释为 10,按 signed 解释为 -6。它不是取出符号位后,把其余位当作绝对值。固定位宽中, 可通过按位取反取反 将 0 变为 1、1 变为 0 的 NOT 运算。表达式上方的横线表示对其覆盖的整个表达式应用 NOT。了解更多再加 1 得到,但最小值 对应的正数 +8 不在同样的四位 signed 范围内。
扩展必须保留数值
unsigned 扩展在前面补 0,signed 扩展在前面补原符号位。将 1010 变成 00001010 得到 +10,变成 11111010 得到 -6。即使扩展同一位串,解释不同,所需电路也不同。
logic signed [3:0] a, b;
logic signed [4:0] exact;
logic [3:0] result;
logic overflow;
assign exact = {a[3], a} + {b[3], b};
assign result = exact[3:0];
assign overflow = (a[3] == b[3]) && (result[3] != a[3]);本例为不带进位输入的双操作数 signed 加法。用 exact 保留五位和,并检查缩窄结果的符号是否正确。
初值设为 11111010。确认 unsigned 的 250 与 signed 的 −6 使用同一个位串。切换 b7 后,两种解释的数值会向相反方向变化。
11111010 → unsigned 250 · signed -6 · hex 0xFA
进位不同于有符号溢出
两个同号数相加而结果变号时,就发生溢出。四位运算中, 存为 1010,看起来是 -6; 存为 0111,看起来是 +7。两个异号数相加不会出现这种越界。
RTL 表达式混用 signed 与 unsigned,容易使比较与扩展规则混淆。请明确两个操作数的位宽与符号属性,并将最小值、-1、0 和最大值纳入边界测试。
自己试试
在四位 signed 运算中,求 与 的存储位串及溢出情况,并解释对 取负的结果。
阅读解释
为 1001,无溢出。10 超出范围,存为 1010(-6),因此溢出。对 -8 取反再加 1,仍得到 1000,因为无法表示 +8,不能把它当作正确的绝对值计算。