例如
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
或两者都可以(我们将高位视为脏)?
我可以在特殊编译器上做一些实验。但我不确定每件事情都是非常详细的。我只需要一些正式的承诺。
答案 0 :(得分:2)
cdecl似乎是应用程序二进制接口的不完整规范。我希望它依赖于System V应用程序二进制接口的完整性。我找不到明确的陈述。
从System V Application Binary Interface: Intel386 Architecture Processor Supplement的第43页开始,“函数将所有整数值参数作为单词传递,根据需要扩展或填充有符号或无符号字节和半字。”
这是模糊的,因为它没有指定是否应通过符号扩展,零填充或其他方式扩展参数。我会将其解释为意味着添加的位的内容未指定,因此调用者可以传递任何值,并且被调用者不应该使用额外的位。
请注意,在C函数调用中转换表达式不会对参数的传递方式产生任何影响。传递的参数的类型由函数声明确定。我将您提供的示例代码解释为伪代码,用于传递不同大小的整数的概念,而不是实际的C代码。