数据类型大小与sizeof(数据类型)之间的差异

时间:2015-11-04 16:55:00

标签: c++ c

我正在学习C ++并遇到以下问题。我只是一个初学者,我感到困惑。 Isn< sizeof()函数应该返回数据类型的大小吗?为什么数据对象的大小与sizeof()不同?我不理解答案的解释。

假设在一个假设的机器中,char的大小是32位。 sizeof(char)会返回什么?

a)4

b)1

c)依赖于实施

d)依赖机器

答案:B

说明:标准不要求char为8位,但要求sizeof(char)返回1。

6 个答案:

答案 0 :(得分:12)

sizeof运算符生成 bytes 中类型的大小,其中一个字节被定义为char的大小。因此,无论在给定平台上有多少 sizeof(char)char始终为1。

这适用于C和C ++。

根据C11标准, 6.5.3.4

  
      
  1. sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。大小由操作数的类型决定....   
  2.   

然后,

  
      
  1. sizeof应用于类型为charunsigned charsigned char的操作数(或其合格版本)时,结果为1。
  2.   

来自C ++ 11标准, 5.3.3

  
      
  1. sizeof运算符产生其操作数的对象表示中的字节数。操作数是表达式,它是未评估的操作数(第5条),或带括号的 type-id .... ... sizeof(char),{{1} }和sizeof(signed char)是1。
  2.   

(强调我的)

答案 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);