整型的扩展与截断

当在不同位宽的整数类型之间进行转换时,涉及扩展(小位宽 → 大位宽)和截断(大位宽 → 小位宽)两种操作。

扩展

零扩展(Zero Extension)

用于无符号数的扩展。

  • 在原有高位之前补充0
  • 数值保持不变
  • 例如:0101(4位,值5)→ 00000101(8位,值5)

符号扩展(Sign Extension)

用于有符号数(补码) 的扩展。

  • 在原有高位之前补充原最高位(符号位)的值
  • 数值保持不变
  • 原理:补码的负权重通过复制符号位得以保持

示例(4位扩展到8位):

原4位扩展后8位数值
0101 (5)000001015
1011 (-5)11111011-5

对于 1011(4位补码 = -8 + 0 + 2 + 1 = -5):

  • 符号扩展为 11111011(8位补码 = -128 + 64 + 32 + 16 + 8 + 0 + 2 + 1 = -5)
  • 可以验证:新增加的符号位权重之和恰好抵消了多出来的负权

证明思路

符号扩展一位的效果:原来的最高位 在新的表示中从权重 变为了 ,这正好等于它原本作为符号位的负权

截断(Truncation)

当将大位宽的整数强制转换为小位宽时,直接丢弃高位的比特位。

截断规则

其中 是目标类型的位数。

  • 无符号数截断:相当于取模 后的余数
  • 有符号数截断:先按无符号数截断(取模),然后用补码解释该结果

示例

int x = 53191;          // 二进制: 1100111111100111
short sx = (short) x;   // 截断为16位: 111111100111 = -12345
  • 截断后的位模式为低16位:1100111111100111
  • 解释为16位补码:最高位为1,故为负数,数值为

相关笔记

链接到