You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RISC-V加载负数异常:存入-2999到s7寄存器得到1097求助

问题原因与解决方案

核心问题:addi指令的立即数范围限制

RISC-V的addi指令使用12位有符号立即数,能表示的数值范围是 -2048(即 -2^11)到 2047(即 2^11-1)。你要加载的-2999明显超出了这个范围,汇编器会自动对立即数进行12位截断处理——只保留数值的低12位补码,最终导致寄存器里的值变成了1097。

数值截断的计算逻辑

对于超出12位范围的数,实际传入addi的是该数模4096(2^12)的结果:

-2999 + 4096 = 1097

这就是为什么你看到寄存器里是1097的原因。

正确加载大数值的方法

要加载超出12位范围的数值,需要结合lui(加载高位立即数)和addi指令,分别处理32位数值的高20位和低12位:

# 加载-2999到s7寄存器
lui s7, %hi(-2999)   # 加载-2999的高20位到s7的高位部分
addi s7, s7, %lo(-2999) # 补充-2999的低12位,完成完整数值的加载

如果不想用伪指令%hi/%lo,也可以手动计算对应位段的数值:

  • -2999的32位补码是11111111111111111110100100000111
  • 高20位对应十进制-2,低12位对应十进制2311
    因此代码也可以写成:
lui s7, -2
addi s7, s7, 2311

内容的提问来源于stack exchange,提问作者Savage's Project

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:32:41