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

为何RISC-V64整数调用约定中unsigned int会被符号扩展至64位寄存器?

RISC-V整数调用约定的扩展规则疑问

宽度不超过XLEN位的标量通过单个参数寄存器传递,若无可用寄存器则通过栈传值。在寄存器或栈中传递时,宽度小于XLEN位的整数标量会先根据其类型的符号扩展至32位,再符号扩展至XLEN位。

按照上述约定会产生一个令人困惑的结果:unsigned short类型的参数会被零扩展至64位,而unsigned int类型的参数却会被符号扩展至64位。既然二者都是无符号类型,而且在C语言的隐式类型转换规则中unsigned int始终是零扩展的,为何不统一采用零扩展?

示例代码:

void foo(unsigned short x);
void bar(unsigned int x);

void main(void)
{
    foo(0xffffU);
    bar(0xffffffffU);
}

生成的汇编代码:

main:
        ...
        li      a5,65536
        addi    a0,a5,-1
        call    foo
        li      a0,-1
        call    bar

内容的提问来源于stack exchange,提问作者Changbin Du

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:03:12