【发布时间】:2013-12-09 18:14:02
【问题描述】:
例如
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
或者两者都可以(我们将高位视为脏)?
我可以在特殊的编译器上做一些实验。但我不确定每件事在细节上都是一样的。我只需要一些正式的承诺。
【问题讨论】:
-
编译器实现细节有什么不同?你不应该对那些高位做任何事情,只是认为它们是未定义的。
-
@DCoder:如果您正在使用需要与 C 例程互操作的其他语言编写代码,或者您正在编写需要与其他 C 实现互操作的 C 实现,这很重要。
-
你是说当函数原型为
int foo(short x)'时,你认为大于short的数会被压入堆栈?为什么会这样? -
@Floris:应用程序二进制接口将指定推送到堆栈的参数的最小大小,以便堆栈保持所需的对齐方式。
-
@Floris:问题是询问具体的 C 实现,而不是 C 标准。 C 标签并不意味着问题是关于 C 标准的。 “C”不仅仅意味着标准 C;除了标准之外,还有其他版本的 C。此外,有些人添加标签是因为问题涉及标记的主题,而不是因为它直接与标记的主题有关。标题特别表明问题是关于 cdecl 调用约定的。
标签: c calling-convention cdecl