2

例えば

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

または、両方とも問題ありませんか (上位ビットはダーティとして扱います)。

特別なコンパイラでいくつかの実験を行うことができます.しかし、すべてが詳細に同じであるかどうかはわかりません.正式な約束が必要です.

4

1 に答える 1

2

cdecl は、アプリケーション バイナリ インターフェイスの不完全な仕様のようです。完全性は System V Application Binary Interface に依存していると思います。これについての明確な声明を見つけることができません。

System V Application Binary Interface: Intel386 Architecture Processor Supplementの 43 ページから、「関数はすべての整数値の引数を単語として渡し、必要に応じて符号付きまたは符号なしのバイトとハーフワードを拡張またはパディングします。」</p>

引数を符号拡張、ゼロパディング、またはその他の方法で拡張する必要があるかどうかを指定していないため、これはあいまいです。追加されたビットの内容が指定されていないことを意味すると解釈します。したがって、呼び出し元は任意の値を渡すことができ、呼び出し先は余分なビットを使用しないでください。

C 関数呼び出しで式をキャストしても、引数の受け渡し方法には影響しないことに注意してください。渡される引数の型は、関数宣言によって決まります。提供されたサンプル コードは、実際の C コードではなく、さまざまなサイズの整数を渡す概念の疑似コードとして解釈しました。

于 2013-12-09T18:32:05.780 に答える