Skip to content

定义Definition

整数扩展、截断与移位

Sign extension · Zero extension · Integer truncation

用保值等式定义零扩展与符号扩展,区分截断、右移和先运算后扩展的结果。

形式陈述 ​

取 W>w,用定宽整数的 Uw,Sw 解释 w 位串。零扩展在高处补 W−w 个零,满足 UW(zext(b))=Uw(b)。符号扩展复制最高位,满足 SW(sext(b))=Sw(b)。

截断 truncW→w 只保留低 w 位,故无符号值变为模 2w 的余数。它能无损保留一个有符号整数,当且仅当该整数已在 [−2w−1,2w−1−1] 内;无符号保值条件则为 [0,2w−1]。

本页把位移量限制在 0≤k<w。逻辑右移高位补零,结果无符号值为 ⌊Uw(b)/2k⌋。算术右移复制原符号位,结果补码值为 ⌊Sw(b)/2k⌋。这里的舍入是向负无穷取整。

直觉

扩展要先问“保留哪一种值”。对负数补零,会把原来的负权最高位变成普通正权位;复制符号位则用新增的一串高位抵消权重变化。截断没有办法知道被删掉的位是什么,所以一般不是扩展的可逆操作。

若原最高位为一,符号扩展后的无符号值为 Uw(b)+(2W−2w)。再减去 2W,正好得到 Uw(b)−2w=Sw(b)。这条等式直接证明符号扩展保值。

例子与边界

保无符号值和保有符号值是两个任务 ​

八位 11110110 的无符号值为 246,补码值为 −10。扩为十六位时,00F6 保留 246,FFF6 保留 −10。若一个有符号字节 load 本应产生 FFF6,错误零扩展便把负索引变成正数;它不是精度上的小误差。

扩展与加法不能任意交换 ​

先在八位下计算 127+1,低八位是 80,再符号扩展得 FF80,即 −128。先把两个输入扩为十六位再相加,得 0080,即 128。前一种计算已经丢失“结果超出八位范围”的信息,事后扩宽救不回来。

零扩展同样不能跨越可能溢出的旧宽度加法:八位 255+1 先回绕为零,而十六位相加为 256。因此“先扩再算”与“先算再扩”的等价性需要额外的无溢出条件。

右移不是一律向零除法 ​

八位 −3 是 11111101。算术右移一位得到 11111110,即 −2;按向零舍入的整数除法,−3/2 则为 −1。逻辑右移得到 01111110,即 126。三个结果来自三个明确不同的操作。

左移并保留低 w 位对应乘 2k 后取模;它可能丢失原来的高位。本文没有为负位移量或 k≥w 定义操作。真实 ISA 可能屏蔽位移量,源语言可能采用其他规则,必须分别查契约。

推论与应用

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 与移位规则应与本页数学映射分别阅读。
关系图谱17 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组