sizeof是否返回C中某个类型的字节数或八位字节数?
简单地放入C和变体(与wuss java及其虚拟机不同),不同目标上的基元类型的大小可能差异很大,除非你使用stdint.h
定义的固定宽度类型,否则实际上无法保证,甚至你的实施必须支持他们。
无论如何假设(因为在大多数现代机器上,一个字节是八位字节,为了网络目的,我假设(ASCII))sizeof是以字节还是以八位字节的forms返回数据类型的大小?
答案: sizeof
以字节为单位返回类型的大小。
示例: sizeof(char)
100%保证为1
,但这并不意味着它是一个八位字节(8位)。
标准certificate:
在6.5.3.4中,第2点:
sizeof运算符产生其操作数的大小(以字节为单位),该操作数可以是表达式或类型的带括号的名称。 大小由操作数的类型确定。 结果是整数。 如果操作数的类型是可变长度数组类型,则计算操作数; 否则,不评估操作数,结果是整数常量。
…
当应用于具有char,unsigned char或signed char(或其限定版本)类型的操作数时,结果为1 。 当应用于具有数组类型的操作数时,结果是数组中的总字节数。当应用于具有结构或联合类型的操作数时,结果是此类对象中的总字节数,包括内部和尾随填充。
另外,在第3.6节第3点:
一个字节由一个连续的位序列组成,其数量是实现定义的
sizeof
以字节为单位给出大小。 但是,请注意“字节”是C标准中的技术术语,并且定义为sizeof(char) == 1
。
sizeof
始终返回size作为字节数。 但根据维基百科 :
在编程语言C和C ++中,一元运算符sizeof用于计算任何数据类型的大小,以表示类型所需的字节数来度量。 此上下文中的一个字节与unsigned char相同, 并且可能大于8位,尽管这种情况并不常见 。
根据我自己的经验,使用具有异国情调的’C’编译器的嵌入式微控制器,我看到:
sizeof( uint8 )
返回1
sizeof( uint16 )
返回1
sizeof( uint32 )
返回2
显然,我正在处理的机器是最小的可寻址实体是16位,所以sizeof不符合C89或C99。
我想说在主流的C89和C99兼容系统上,接受的答案是正确的。 不幸的是,“C”编译器仍然可以称为“C”编译器,即使它不符合25年前的标准。 我希望这个答案有助于把事情放在一边,给出更多奇特的系统。