Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;sizeof操作符:为什么sizeof(';a';)返回不同的值?_C++_C_Memory - Fatal编程技术网

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

C++ C/C++;sizeof操作符:为什么sizeof(';a';)返回不同的值?,c++,c,memory,C++,C,Memory,可能重复: 我是C语言的初学者,对此感到困惑 C:我尝试使用“%zu”修饰符在C中打印sizeof('a'),它打印的值为4 < C++ >代码> C++ >使用CUT的打印sieOf(A'),PrtTf(使用以上格式)均打印值1。 我认为正确的值应该是1,因为'a'将被视为字符。为什么它在C中不返回4?这两种语言的操作大小是否不同?如果是,区别是什么?为什么返回不同的值? 在这两种情况下,我使用了GCC编译器。 < P> C中, 'As/Cuth>是字符常量,它被当作整数,因此得到4的大小,

可能重复:

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

C:
我尝试使用“%zu”修饰符在C中打印sizeof('a'),它打印的值为4

< C++ >代码> C++ >使用CUT的打印sieOf(A'),PrtTf(使用以上格式)均打印值1。 我认为正确的值应该是1,因为'a'将被视为字符。为什么它在C中不返回4?这两种语言的操作大小是否不同?如果是,区别是什么?为什么返回不同的值?
在这两种情况下,我使用了GCC编译器。

< P> C中,<代码> 'As/Cuth>是字符常量,它被当作整数,因此得到4的大小,而C++中,它被当作<代码> char < /C>。这是问题的重复:

在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');
}
基本上,字符文字指定构成int的四个字节, 从左到右,高阶字节优先。 缺少的前导字节用0填充。 因此,在我的机器上,第二组和第三组printf语句打印

97
24930
6382179
1633837924
61
6162
616263
61626364
在十六进制输出中,您可以看到 文字(从左到右的ASCII码):“a”映射到 最高顺序字节0x61)

最后,第四组打印:

a
b
c
d
i、 e.字符文本作为整数推送到堆栈上,但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;
}
因此,单字节字符文字被视为char,而多字节文字被视为char 被视为int

重要提示

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

编辑

固定答案(感谢提示):字符文字在C中有int类型,它们
因为C不是C++,所以不被铸造到int < /p>。我不想在这里被嘲笑。如果C中的字符与Python中的字符不同,那么你可能不会感到惊讶,但是很多人认为C只是C++的子集。完全不是这样。下面是好的答案,但是最基本的是C和C++是2种不同的语言。我曾经尝试过搜索,但是它没有任何问题。谢谢你让我知道这个副本。-1:C中没有定义一个Int的大小超过它与char和long的关系。@mattnz-如果你阅读链接的答案,你可以在注释(第一个也是唯一的答案)中清楚地看到
sizeof
an
Int
是依赖于平台的。我没有解决这个问题,因为1。链接的线程解决了这个问题,我希望mod关闭这个线程,然后2。根据提问者问题的上下文,显然在他的机器上int的大小是4。@Blackjack:并没有改变许多C编程错误都是由int是4个字符的断言引起的,并且你的答案继续了这个神话的阴险传播。如果你知道4是不正确的,你为什么要写它?我想我们必须同意不同意,这是我的一个错误。除了16位之外,大多数系统都有4字节的
int
。小错误:字符常量不能转换为
int
,它们的类型为
int
。谢谢,我会解决这个问题。这意味着每次分配它们时,它们都被转换为char。@larsmans:我从未见过int占64位的实现,但据我所知,最初的想法是in C int对应于处理器寄存器的宽度。尽管如此,我认为使用64位处理器时,8位字符、16位短、32位整数、64位长(64位整数对我来说有点尴尬)更为自然。此外,我有点惊讶的是,在一个小小的endian体系结构上,“abcd”被表示为0x61626364,不知怎的,我期待的是0x64636261。
#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;
}
1
4
4
4
a
24930
6382179
1633837924