整型的扩展与截断
当在不同位宽的整数类型之间进行转换时,涉及扩展(小位宽 → 大位宽)和截断(大位宽 → 小位宽)两种操作。
扩展
零扩展(Zero Extension)
用于无符号数的扩展。
- 在原有高位之前补充0
- 数值保持不变
- 例如:
0101(4位,值5)→00000101(8位,值5)
符号扩展(Sign Extension)
用于有符号数(补码) 的扩展。
- 在原有高位之前补充原最高位(符号位)的值
- 数值保持不变
- 原理:补码的负权重通过复制符号位得以保持
示例(4位扩展到8位):
| 原4位 | 扩展后8位 | 数值 |
|---|---|---|
0101 (5) | 00000101 | 5 |
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,故为负数,数值为
相关笔记
链接到
- 上一个知识点:2.4 有符号数与无符号数的转换
- 下一个知识点:2.6 整型加法