为何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
相关产品推荐
相关产品推荐

