2012-08-08 117 views
15

简单地放入C和变体(与虚拟机不同,wuss java不同),不同目标上的原始类型的大小可能差别很大,除非您使用stdint.h中定义的固定宽度类型,你的实现必须支持他们。是否sizeof返回C中的字节数或类型的八位字节数?

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

+3

字节,但是一个字节(表示为char)具有CHAR_BITS位。如果你需要'T'中的八位位组数,请执行'sizeof(T)* CHAR_BITS/8'。在大多数平台上,'CHAR_BITS'是'8'。 – GManNickG 2012-08-08 15:46:17

+2

@GManNickG'CHAR_BIT'(没有S):) – Praetorian 2012-08-08 15:55:45

+0

float octetPercent = sizeof(T)* CHAR_BIT /8.0; – awiebe 2012-08-08 16:05:55

回答

16

答案:sizeof返回类型的大小在字节


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


由标准实践证明:

在6.5.3.4

,点2:其操作数的

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

...

当应用于具有类型char,无符号的字符,或符号的字符, (或一个合格音响ED版本物)的结果是1一个操作数。当应用于数组类型为 的操作数时,结果为数组中的字节总数)应用于具有结构或联合类型的操作数 时,结果为此类对象中的总字节数 包括内部和尾部填充。

另外,在第3.6节,第3点:

一个字节的比特位构成的连续序列的,其数目是实现定义

+0

非常全面,谢谢你。 – awiebe 2012-08-08 16:37:39

4

sizeof总是返回大小作为字节数。但根据wikipedia

在编程语言C和C++,一元运算符的sizeof用于计算任何数据类型的大小,在以代表类型所需要的字节数来测量。在这个上下文中的字节与无符号字符相同,并且可能大于8位,尽管这是罕见的

6

sizeof给出了大小以字节表示。但是请注意,“字节”是C标准中的一个技术术语,其定义如下:sizeof(char) == 1

1

从我自己的经验,在嵌入式微控制器,具有异国情调的 'C' 编译器的工作,我已经看到了:

sizeof(uint8) 

回报1

sizeof(uint16) 

回报1

sizeof(uint32) 

返回2

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

我会说主流C89 &符合C99的系统,接受的答案是正确的。 不幸的是,“C”编译器仍然可以称为“C”编译器,即使它不符合25年前的标准。我希望这个答案有助于在给定更多异域系统的情况下进行透视。

相关问题