“记 $\operatorname{sext}{12}$ 为把12位立即数符号扩展为32位,$\operatorname{low}{32}$ 为保留低32位,$L(M,a)=\sum {i=0…”
形式陈述
取
截断
本页把位移量限制在
直觉
扩展要先问“保留哪一种值”。对负数补零,会把原来的负权最高位变成普通正权位;复制符号位则用新增的一串高位抵消权重变化。截断没有办法知道被删掉的位是什么,所以一般不是扩展的可逆操作。
若原最高位为一,符号扩展后的无符号值为
例子与边界
保无符号值和保有符号值是两个任务
八位 11110110 的无符号值为 00F6 保留 FFF6 保留 FFF6,错误零扩展便把负索引变成正数;它不是精度上的小误差。
扩展与加法不能任意交换
先在八位下计算 80,再符号扩展得 FF80,即 0080,即
零扩展同样不能跨越可能溢出的旧宽度加法:八位
右移不是一律向零除法
八位 11111101。算术右移一位得到 11111110,即 01111110,即
左移并保留低
推论与应用
RV32I 立即数解码需要先把分散的立即数位拼好,再按该立即数的宽度符号扩展。指令字的最高位常是符号来源,但不能把整个指令字当有符号整数去扩展。
在指令选择中,窄 load、窄算术和比较的先后顺序都是正确性义务。可用上述三个结构不同的测试检查保值规则:负数扩宽、越界加法、奇负数右移。它们分别击中解释、信息丢失和舍入方向。
参考资料
- Randal E. Bryant and David R. O’Hallaron, Computer Systems: A Programmer’s Perspective, 3rd ed., 2016,§2.2–2.3,整数宽度转换与移位。
- RISC-V International,RV32I 2.1,固定文档版 v20260120,§1.1.4 与 §1.1.6;ISA 的立即数、窄 load 与移位规则应与本页数学映射分别阅读。