如何在cdecl调用约定中将signed char和short作为参数传递

时间:2013-12-09 18:14:02

标签: c calling-convention cdecl

例如

int foo(short x);
short s = -1; 
foo(s);

相同
//int foo(short x); //Updated
int foo(signed x);
short s = -1; 
foo((signed)s);//sign-extend and push to stack

或者与

相同
//int foo(short x); //Updated
int foo(unsigned)
short s = -1; 
foo((unsigned)(unsigned short)s);//zero-extend and push to stack

或两者都可以(我们将高位视为脏)?

我可以在特殊编译器上做一些实验。但我不确定每件事情都是非常详细的。我只需要一些正式的承诺。

1 个答案:

答案 0 :(得分:2)

cdecl似乎是应用程序二进制接口的不完整规范。我希望它依赖于System V应用程序二进制接口的完整性。我找不到明确的陈述。

System V Application Binary Interface: Intel386 Architecture Processor Supplement的第43页开始,“函数将所有整数值参数作为单词传递,根据需要扩展或填充有符号或无符号字节和半字。”

这是模糊的,因为它没有指定是否应通过符号扩展,零填充或其他方式扩展参数。我会将其解释为意味着添加的位的内容未指定,因此调用者可以传递任何值,并且被调用者不应该使用额外的位。

请注意,在C函数调用中转换表达式不会对参数的传递方式产生任何影响。传递的参数的类型由函数声明确定。我将您提供的示例代码解释为伪代码,用于传递不同大小的整数的概念,而不是实际的C代码。