跳到主要内容

有符号与无符号转换

转换时位模式会变化吗?​

  • 结论: 不变, 改变的只是对同一串位的解释方式;
  • 后果: 数值可能改变, 位级表示保持原样;
  • 隐式转换: 有符号数与无符号数混合运算时, 有符号数会被隐式转成无符号数;

补码怎样转成无符号数?​

  • 对满足 TMinw≤x≤TMaxwTMin_w\le x\le TMax_w 的 xx:

T2Uw(x)={x+2w,x<0x,x≥0T2U_w(x)=\begin{cases}x+2^w, & x<0\\ x, & x\ge 0\end{cases}

  • 直觉: 负数整体上移 2w2^w, 映射到无符号域的后半段;

无符号数怎样转成补码?​

  • 对满足 0≤u≤UMaxw0\le u\le UMax_w 的 uu:

U2Tw(u)={u,u≤TMaxwu−2w,u>TMaxwU2T_w(u)=\begin{cases}u, & u\le TMax_w\\ u-2^w, & u>TMax_w\end{cases}

  • 直觉: 大于 TMaxwTMax_w 的值整体下移 2w2^w, 落到负数区间;

扩展位宽时补 0 还是补符号位?​

  • 无符号数: 零扩展, 高位补 0;
  • 补码: 符号扩展, 高位补符号位;
  • 原因: 只有补符号位才能保持数值不变; 对负数补 0 会把它变成一个大正数;

截断高位会得到什么?​

  • 无符号数: x′=x mod 2kx'=x \bmod 2^k, 即丢弃高位、保留低 k 位;
  • 补码: x′=U2Tw(x mod 2k)x'=U2T_w(x \bmod 2^k);
  • 结论: 截断等价于取模, 位模式唯一确定, 但数值可能改变;