返回首页
RV32 / RV64

看懂 RV32 和 RV64 的核心差异

聚焦寄存器宽度、load/store 行为、32-bit 运算指令和指针读写,帮助初学者快速避开最常见的误解。

核心差异速查表

6 个最关键的对比维度,一眼看清。

对比维度 / ComparisonRV32RV64
寄存器宽度32 位64 位
常见 ABI 数据模型ILP32:int/long/指针通常 4 字节LP64:long/指针通常 8 字节
lw 行为读取 32 位值,结果宽度仍为 32 位读取 32 位值并符号扩展到 64 位
常见指针读取lw rd, offset(rs1)ld rd, offset(rs1)
常见指针存储sw rs2, offset(rs1)sd rs2, offset(rs1)
RV64 32 位 word 运算add, sub, sll…addw, subw, sllw… (w 后缀)

重点对比

RV32
# 32 位加法add a0, a1, a2
RV64
# XLEN 位加法(RV64 为 64 位)add   a0, a1, a2# 低 32 位相加,结果符号扩展到 64 位addw  a0, a1, a2# 低 32 位加立即数,结果符号扩展addiw a0, a1, 1
易踩坑: RV64 下 add 是 XLEN 位运算;如果要表达 32 位 int/word 结果语义,用 addw/addiw。不要把 addw 用作普通 64 位指针地址计算。
RV32
# t0 = 从内存读取的 32 位值lw t0, 0(sp)
RV64
# t0 = 符号扩展(32 位 → 64 位)lw  t0, 0(sp)# t0 = 零扩展(32 位 → 64 位)lwu t0, 0(sp)
易踩坑: lw 在 RV64 下会自动把 bit31 复制到高 32 位。如果期望高位全为 0,请改用 lwu(load word unsigned)。
RV32
# 读一个 32 位指针/地址lw t0, 0(sp)# 存一个 32 位指针/地址sw t0, 0(sp)
RV64
# 读一个 64 位指针/地址ld t0, 0(sp)# 存一个 64 位指针/地址sd t0, 0(sp)
易踩坑: 在常见 ILP32/LP64 psABI 数据模型下,RV32 指针通常为 4 字节,RV64 指针通常为 8 字节。RV64 上 lw 只读 4 字节并符号扩展,不能替代 ld 读取 64 位指针。
继续查阅
官方规范来源

本页参考以下官方 RISC-V 文档组织架构、ABI、CSR 和伪指令说明;平台或操作系统 ABI 差异仍需按对应规范核验。