数据类型的大小和大小(数据类型)之间的区别

The difference between size of datatype and sizeof(data type)

本文关键字:数据类型 之间 区别 小和大      更新时间:2023-10-16

我正在学习C++,遇到了以下问题。我只是一个初学者,我很困惑。sizeof(( 函数不应该返回数据类型的大小吗?为什么数据对象的大小可能与其 sizeof(( 不同?我不明白答案的解释。

假设在一台假设的机器中,char 的大小为 32 位。大小(字符(会返回什么?

a( 4

b( 1

c( 依赖于实施

d( 取决于机器

答案:b

说明:该标准不要求字符为 8 位,但确实要求 sizeof(char( 返回 1。

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

这适用于 C 和 C++。


从C11标准,6.5.3.4

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

然后

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

从 C++11 标准 5.3.3

  1. sizeof运算符在其操作数的对象表示形式中生成字节数。操作数要么是一个表达式,它是一个未计算的操作数(条款 5(,要么是一个带括号的 type-id sizeof(char)sizeof(signed char)sizeof(unsigned char)为1。

(强调我的(

你只是对字节八位字节之间的区别感到困惑。

字节是一个字符的大小。这会产生始终为真sizeof(char) == 1,因为sizeof返回以字节为单位的大小

八位字节8 位组成。

在几乎所有现代平台上,字节的大小恰好与八位字节的大小相同。这就是为什么将它们混为一谈是一个常见的错误,甚至书籍作者和教授也在这样做。

per 5.3.3 [expr.sizeof]

sizeof 运算符在其操作数的对象表示形式中生成字节数。操作数要么是表达式(它是未计算的操作数(子句 5(,要么是带括号的类型 ID。sizeof 运算符不得应用于具有函数或不完全类型的表达式,也不得应用于枚举 其基础类型在声明其所有枚举器之前未固定的类型,类型为此类类型的括号名称,或指定位字段的 glvalue 的类型。sizeof(char(、sizeof(signed char( 和 sizeof(unsigned char( 为 1。[...]

强调我的

因此,无论char占用多少位,其大小始终为1

sizeof(x)返回以 char 大小单位表示的x的大小。

没有 sizeof(char( 为 4 的机器。它始终为 1 个字节。该字节可能包含 32 位,但就 C 编译器而言,它是一个字节。

"8 位"的正确名称是八位组。C 标准使用单词"byte"来表示字符大小的对象。其他人可能以不同的方式使用"字节"一词,通常是当他们表示"八位字节"时,但在C(和C++,或Objective-C(中,它的意思是"字符大小的对象"。字符可能超过 8 位,也可能超过一个八位字节,但它始终是一个字节。

问题应该是——假设在一台假设的机器中,word size(size of registers)是 32 位。大小(字符(会返回什么?

答案将是1 byte.

在计算中,单词是数据的自然单位的术语,用于表示 特定的处理器设计。单词是固定大小的数据片段 由指令集或硬件作为一个单元处理 处理器。单词中的位数(字大小、字宽或 字长(是任何特定处理器的重要特征 设计或计算机体系结构。-- 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);