web-dev-qa-db-ja.com

Cでは、 'a'がintのときにsizeof(char)1になるのはなぜですか?

私は試した

printf("%d, %d\n", sizeof(char), sizeof('c'));

そして、出力として1、4を得ました。文字のサイズが1の場合、なぜ'c' 4ください。整数だからだと思います。だから私がするときchar ch = 'c'; char変数に割り当てられたときに、その4バイトの値から1バイトの値への暗黙的な変換が内部で発生していますか?

42
legends2k

Cでは、 'a'は整数定数(!?!)なので、アーキテクチャーには4が適切です。割り当てのために暗黙的にcharに変換されます。 sizeof(char)は、定義により常に1です。標準では1が何であるかは明記されていませんが、多くの場合はバイトです。

35

C標準では、「a」などの文字リテラルはchar型ではなくint型であると規定されています。したがって、(プラットフォーム上で)sizeof == 4になります。詳細については、 この質問 を参照してください。

7
anon

sizeof演算子の通常の動作です( Wikipedia を参照):

  • データ型の場合、sizeofはデータ型のサイズを返します。 charの場合、1を取得します。
  • 式の場合、sizeofは変数または式の型のサイズを返します。文字リテラルはintとして入力されるため、4になります。
5

これはISO C11でカバーされています6.4.4.4 Character constantsただし、以前の標準とはほとんど変わっていません。それは、段落/10

整数文字定数の型はintです。シングルバイト実行文字にマップされる単一文字を含む整数文字定数の値は、整数として解釈されるマップされた文字の表現の数値です。

4
paxdiablo

ANSI C標準によれば、charは整数が使用されるコンテキストでintに昇格され、printfで整数フォーマット指定子を使用したため、異なる値。 charは通常1バイトですが、ランタイムとコンパイラに基づいて定義された実装です。

0
t0mm13b