23

简单地说,在 C 和变体中(不像 wuss java 和它的虚拟机)不同目标上的原始类型的大小可能会有很大差异,除非你使用定义的固定宽度类型,否则真的不能保证stdint.h,即使那样你的实现也有支持他们。

无论如何假设(因为在大多数现代机器上,一个字节是一个八位字节,出于网络目的,我​​假设(ASCII)) sizeof 是否以字节或八位字节返回数据类型的大小?

4

4 回答 4

25

答案:sizeof返回类型的大小(以字节为单位)。


示例:sizeof(char)100% 保证是1,但这并不意味着它是一个八位字节(8 位)。


标准证明:

在 6.5.3.4 中,第 2 点:

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或类型的括号名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。

...

当应用于具有 char、unsigned char 或 signed char 类型(或其限定版本)的操作数时,结果为 1。当应用于具有数组类型的操作数时,结果是数组中的总字节数)当应用于具有结构或联合类型的操作数时,结果是此类对象中的总字节数,包括内部和尾随填充。

此外,在第 3.6 节第 3 点中:

一个字节由连续的位序列组成,位的数量由实现定义

于 2012-08-08T15:43:52.400 回答
6

sizeof总是以字节数返回大小。但根据维基百科

在编程语言 C 和 C++ 中,一元运算符 sizeof 用于计算任何数据类型的大小,以表示该类型所需的字节数来衡量。在这种情况下,字节与无符号字符相同,并且可能大于 8 位,尽管这并不常见

于 2012-08-08T15:43:40.413 回答
6

sizeof以字节为单位给出大小。但是,请注意“字节”是 C 标准中的一个技术术语,其定义为sizeof(char) == 1.

于 2012-08-08T15:45:09.993 回答
2

根据我自己的经验,在使用具有异国情调的“C”编译器的嵌入式微控制器上工作时,我看到了:

sizeof( uint8 )

返回 1

sizeof( uint16 )

返回 1

sizeof( uint32 )

返回 2

显然,我在处理一台机器时最小的可寻址实体是 16 位的,所以 sizeof 不符合 C89 或 C99。

我想说,在主流 C89 和 C99 兼容系统上,公认的答案是正确的。不幸的是,“C”编译器仍然可以称为“C”编译器,即使它不符合 25 年前的标准。考虑到更多奇特的系统,我希望这个答案有助于正确看待事情。

于 2014-08-28T14:12:28.367 回答