2

C について話している本を読みました。最初にコードを提示し、後者で質問する方がよいでしょう。

最初のコード

#include <stdio.h>

int main(void)
{
short num = 3;

printf("%hd\n" , num );

return 0;

} 


セカンドコード

#include <stdio.h>

int main(void)
{
short num = 3;

printf("%d\n" , num );

return 0;

}

特記事項: Intel ベースの PC を使用しているため、int サイズは 32 ビットです。

質問 :

1.) 本書では、この 2 つのコードは正しく実行できると述べてい%hdますが、一方は指定子を使用し、もう一方は指定子を使用してい%dます。

2.)本からの理由は、C メカニズムが自動的に型shortintに変換して計算を高速化するため、%d指定子を使用するか、 %ld32 ビットであっても正しい結果が得られるからです。

3.)私の質問は、いつこの変換が発生したのですか?それprintf()は、式または引数として渡されたときに float 変数が double に変換されるのと同じように、関数に引数として渡したときですか?変数を値で初期化するまでに3??

4.)実際に私は小さな実験をしました。つまり、関数とsizeof一緒に演算子を使用して変数 num のサイズを出力することです。printf()2 bytes

5.) short 変数に値を代入している間にコンバージョンが発生した場合、short 変数を作成する意味は何ですか?? (**そうでない場合、この質問は無視してください)

あなたの助けは大歓迎です

4

3 に答える 3

4
  1. はい、%dこの%hd場合は同等です。 printf()は可変長関数であるため、規則では「整数昇格」が引数に適用されると規定されています。 値はprintf()まったく表示されず、 .shortint
  2. %ldですlong int。これは普通の よりもサイズが大きい可能性があるintため、この本は間違っています。
  3. への呼び出しで変換が行われますprintf()。に渡さshort intれたものは、コンパイラによって にprintf()変換されます。もちろん、 は変更されていません (とにかく、それが何を意味するのかはわかりません! int)short int
  4. を使用してサイズをsizeof印刷すると、 のサイズの数値が印刷されますshort int(数値のタイプは ですsize_t)。 、演算子printf()も表示されず、正しいサイズが報告されます。short intsizeof
  5. 変数を作成するポイントは、short変数が必要な場合は作成することshortです。もちろん、これはほとんどの変数に当てはまります:-)。short intただし、特にが必要ないと思われる場合は、 をそのまま使用しても問題ありませんint
于 2011-04-24T18:29:01.600 に答える
2

プロトタイプなしで関数を呼び出したり、printf(3) のように可変引数を持つ関数を呼び出したりすると、C はデフォルト引数プロモーションと呼ばれるものを適用します。

これらの変換により、float が double に変換され、それより小さいものintintorに変換されunsigned intます。これにより、ほとんどのタイプが調和する傾向があります。

これはおそらく、C が世界に導入した興味深い機能です。実際には、命令セット レベルまたは ABI レベルである程度発生します。パラメーターはレジスターまたはスタックで渡され、通常、スタックの位置合わせを誤ったり、ジャンクを上位ビットに残したりすることは許可されません。

C がハードウェアに非常によく適合し、非常に高速に実行されるもう 1 つの理由です。

于 2011-04-24T18:29:52.570 に答える
1

この変換は への呼び出しで発生します。これprintfは、可変引数関数の場合、get の一部として渡されるすべての引数が最初に(または、引数が の場合は)...に拡張されるためです。intdoublefloat

于 2011-04-24T18:15:41.670 に答える