在 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 == sizef(int),至少在 gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3 上。请注意,此编译器会为上述程序打印几个警告:
warning: multi-character character constant
基本上,字符文字指定组成 int 的四个字节,从左到右,高位字节在前。缺少的前导字节用 0 填充。所以,在我的机器上,第二组和第三组 printf 语句打印
97
24930
6382179
1633837924
61
6162
616263
61626364
在十六进制输出中,您可以看到文字中四个字符的布局(ASCII 码从左到右):“a”映射到最高字节 0x61)。
最后,第四组打印:
a
b
c
d
即字符文字作为整数被压入堆栈,但 printf 仅将该 int 的最低字节打印为 char。
C++ 的行为方式类似,但单字节字符文字被认为是 char 类型,而不是 int。该程序
#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
因此,单字节字符文字被视为 char,而多字节文字被视为 int。
重要的提示
我在一个 int 有 4 个字节的 32 位 Linux 系统上运行我的测试。看看在其他系统上发生了什么会很有趣,例如在 64 位系统上。
编辑
固定答案(感谢提示):字符文字在 C 中具有 int 类型,它们不会强制转换为 int。