C で整数から char への暗黙的なキャストが可能なのはなぜですか?
たとえば、次の場合:
int i = 2789;
printf("%c\n",i);
最も重要なビットから始まるビットが切り捨てられるため、char が返されます。しかし、通常、精度が失われることを意味する場合、暗黙的にキャストすることはできません。なぜここでキャストできるのでしょうか?
ここでは暗黙のキャストは行われません。
printf
これは、関数が呼び出される前に型の引数char
が変換されることを意味します。int
引数は既に typeint
であるため、変換は行われません。
関数に渡されるすべての整数引数は、通常、CPU のワード サイズに昇格されるため、char
、short
、int
またはを渡すかどうかに関係なくlong
、エントリ時のスタックおよび/またはレジスタの物理レイアウトはprintf
いずれにせよ同じです。
したがって、「キャスト」は行われず、通常の引数の受け渡しのみが行われます。
ただし、コードが正しいとは限りません。引数の受け渡しと型の昇格は、C ではなく ABI で定義されているため、すべてのプラットフォームで機能するとは限りません。(ただし、大多数で機能します。)