我正在学习C ++并遇到以下问题。我只是一个初学者,我感到困惑。 Isn< sizeof()函数应该返回数据类型的大小吗?为什么数据对象的大小与sizeof()不同?我不理解答案的解释。
假设在一个假设的机器中,char的大小是32位。 sizeof(char)会返回什么?
a)4
b)1
c)依赖于实施
d)依赖机器
答案:B
说明:标准不要求char为8位,但要求sizeof(char)返回1。
答案 0 :(得分:12)
sizeof
运算符生成 bytes 中类型的大小,其中一个字节被定义为char
的大小。因此,无论在给定平台上有多少位 sizeof(char)
,char
始终为1。
这适用于C和C ++。
根据C11标准, 6.5.3.4
- 醇>
sizeof
运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。大小由操作数的类型决定....
然后,
- 当
醇>sizeof
应用于类型为char
,unsigned char
或signed char
的操作数(或其合格版本)时,结果为1。
来自C ++ 11标准, 5.3.3
- 醇>
sizeof
运算符产生其操作数的对象表示中的字节数。操作数是表达式,它是未评估的操作数(第5条),或带括号的 type-id .... ...sizeof(char)
,{{1} }和sizeof(signed char)
是1。
(强调我的)
答案 1 :(得分:3)
按照5.3.3 [expr.sizeof]
sizeof运算符产生其操作数的对象表示中的字节数。操作数是表达式,它是未评估的操作数(第5条)或带括号的type-id。 sizeof运算符不应用于枚举中具有函数或不完整类型的表达式 在声明所有枚举数之前,其基础类型未固定的类型,此类型的带括号的名称,或指定位字段的glvalue。 sizeof(char),sizeof(signed char)和sizeof(unsigned char)为1. [...]
强调我的
因此,无论char
占用多少位,其大小始终为1
答案 2 :(得分:3)
您只是与字节和八位字节之间的差异混淆。
一个字节是一个字符的大小。这会产生始终为真sizeof(char) == 1
,因为sizeof
会返回字节
八位位组由 8位组成。
在几乎所有现代平台上,字节的大小恰好与八位字节相同。这就是混淆它们的常见错误的原因,即使是书籍作者和教授也在这样做。
答案 3 :(得分:2)
sizeof(x)
返回的x
大小以char
为单位表示。
答案 4 :(得分:0)
没有sizeof(char)为4的机器。它总是1个字节。该字节可能包含32位,但就C编译器而言,它是一个字节。
" 8位"的正确名称是八位字节。 C标准使用单词" byte"对于一个char大小的对象。其他人可能会使用" byte"以不同的方式,通常当它们意味着" octet",但在C(和C ++,或Objective-C)中,它意味着"反对char的大小"。 char可能超过8位,或者超过一个八位位组,但它总是一个字节。
答案 5 :(得分:-1)
问题应该是 - 假设在假设的机器中,word size(size of registers)
是32位。 sizeof(char)会返回什么?
答案是1 byte
。
在计算中,word是a使用的自然数据单位的术语 特定的处理器设计单词是固定大小的数据 通过指令集或硬件处理为一个单元 处理器。一个字中的位数(字大小,字宽或 字长)是任何特定处理器的重要特征 设计或计算机架构。 - https://en.wikipedia.org/wiki/Word_%28computer_architecture%29
在你的情况下,word-size
将是32位。还
历史上,字节是用于编码单个字节的位数 计算机中的文本字符,因此它是最小的 许多计算机体系结构中的可寻址存储器单元。 - https://en.wikipedia.org/wiki/Byte
1字节是存储器的最小可寻址单元,它可以是硬件规格选择的8位,9位或16位。
就sizeof
而言,它首先确定参数的类型,最终以字节为单位计算大小。因此,遵循两个C ++语句将产生相同的结果。
int n;
std::cout<<sizeof(int);
std::cout<<sizeof(n);