Cでは、文字リテラル(定数)の型はintです。したがって、次のプログラムを検討してください
#include <stdio.h>
main(int argc, char *argv[])
{
printf("%zu\n", sizeof('a'));
printf("%zu\n", sizeof('ab'));
printf("%zu\n", sizeof('abc'));
printf("%zu\n", sizeof('abcd'));
printf("%u\n", 'a');
printf("%u\n", 'ab');
printf("%u\n", 'abc');
printf("%u\n", 'abcd');
printf("%x\n", 'a');
printf("%x\n", 'ab');
printf("%x\n", 'abc');
printf("%x\n", 'abcd');
printf("%c\n", 'a');
printf("%c\n", 'ab');
printf("%c\n", 'abc');
printf("%c\n", 'abcd');
}
最初の4つのステートメントはすべて、リテラルを1文字の定数と見なし、少なくともgcc(Ubuntu 4.4.3-4ubuntu5.1)4.4.3では4 == sizef(int)を出力します。このコンパイラは、上記のプログラムに対していくつかの警告を出力することに注意してください。
warning: multi-character character constant
基本的に、文字リテラルは、intを構成する4バイトを左から右に、上位バイトを最初に指定します。欠落している先頭のバイトは0で埋められます。したがって、私のマシンでは、printfステートメントの2番目と3番目のグループが出力されます。
97
24930
6382179
1633837924
61
6162
616263
61626364
16進出力では、リテラル内の4文字のレイアウト(左から右へのASCIIコード)が表示されます。「a」は最上位バイト0x61にマップされます)。
最後に、4番目のグループは次のように出力します。
a
b
c
d
つまり、文字リテラルは整数としてスタックにプッシュされますが、printfはそのintの最下位バイトのみをcharとして出力します。
C ++も同様に動作しますが、1バイトの文字リテラルはintではなくchar型と見なされます。プログラム
#include <iostream>
using namespace std;
main(int argc, char *argv[])
{
cout << sizeof('a') << endl;
cout << sizeof('ab') << endl;
cout << sizeof('abc') << endl;
cout << sizeof('abcd') << endl;
cout << 'a' << endl;
cout << 'ab' << endl;
cout << 'abc' << endl;
cout << 'abcd' << endl;
}
GCCを使用してコンパイルし、同様の警告を出します。その出力はCの出力とは異なります。
1
4
4
4
a
24930
6382179
1633837924
したがって、1バイトの文字リテラルはcharとして扱われ、マルチバイトのリテラルはintとして扱われます。
重要な注意点
intが4バイトの32ビットLinuxシステムでテストを実行しました。他のシステム、たとえば64ビットシステムで何が起こるかを見るのは興味深いでしょう。
編集
修正された答え(ヒントに感謝):文字リテラルはCでint型を持ち、intにキャストされません。