跳到主要内容

无符号数与补码

无符号数怎样编码?​

  • 位向量: 设 [xw−1,⋯ ,x0][x_{w-1},\cdots,x_0] 共 w 位;
  • 编码规则:

B2Uw(x)=∑i=0w−1xi2iB2U_w(x)=\sum_{i=0}^{w-1}x_i2^i

  • 取值范围: [0, 2w−1][0,\ 2^w-1];
  • 性质: 位模式与数值一一对应, 没有冗余编码;

补码怎样编码有符号数?​

  • 区别: 最高位权为负, 其余位与无符号数相同;
  • 编码规则:

B2Tw(x)=−xw−12w−1+∑i=0w−2xi2iB2T_w(x)=-x_{w-1}2^{w-1}+\sum_{i=0}^{w-2}x_i2^i

  • 取值范围: [−2w−1, 2w−1−1][-2^{w-1},\ 2^{w-1}-1];
  • 唯一零: 只有一种 0 的编码;
  • 优势: 加减法可以直接复用无符号数的位级电路;

为什么补码的取值范围不对称?​

  • 位数固定: w 位只有 2w2^w 个不同位模式;
  • 零占用其中一个编码;
  • 其余 2w−12^w-1 个编码分给正负两半, 负数一侧多一个;
  • 结论: ∣TMinw∣=∣TMaxw∣+1|TMin_w|=|TMax_w|+1, 即 −2w−1-2^{w-1} 没有对应的正数;

常用字长下的边界值是多少?​

字长 wUMaxwUMax_wTMinwTMin_wTMaxwTMax_w−1-1 的位模式
8255-1281270xFF
1665535-32768327670xFFFF
324294967295-214748364821474836470xFFFFFFFF
6418446744073709551615-922337203685477580892233720368547758070xFFFFFFFFFFFFFFFF

原码和反码为什么被淘汰?​

  • 原码: 最高位为符号位, 其余位按无符号数解释;
  • 反码: 最高位权为 −xw−1(2w−1−1)-x_{w-1}(2^{w-1}-1), 其余位与补码相同;
  • 缺陷: +0 与 -0 的编码不同, 浪费一个位模式并引入判零分支;
  • 转换: 原码按位取反得反码, 反码最低位加 1 得补码;