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
anInt
是依赖于平台的。我没有解决这个问题,因为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