C / C ++ sizeof运算符:为什么sizeof('a')返回不同的值?

时间:2012-05-23 03:46:12

标签: c++ c memory

  

可能重复:
  Size of character ('a') in C/C++

我是C的初学者,对此感到困惑。

C:我尝试使用“%zu”修饰符在C中打印sizeof('a'),然后输出值4.

C++:使用cout在C ++中打印sizeof('a'),printf(使用上面的格式)都打印了值1.

我认为正确的值应为1,因为'a'将被视为char。为什么不在C中返回4?这两种语言的操作规模是否都不同?如果是这样,有什么区别,为什么它会返回不同的值? 我在两种情况下都使用了gcc编译器。

2 个答案:

答案 0 :(得分:11)

在C中,'a'是一个字符常量,它被视为一个整数,所以得到的大小为4,而在C ++中它被视为char。这与此处的问题重复:

Size of character ('a') in C/C++

答案 1 :(得分:4)

在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

在十六进制输出中,您可以看到四个字符的布局 literal(从左到右的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。

重要提示

我在32位Linux系统上运行测试,其中int有4个字节。这将是 有趣的是看看在其他系统上发生了什么,例如在64位系统上。

修改

修正了答案(感谢提示):字符文字在C中的类型为int,它们 不会被转换为int。