sizeof是否返回C中类型的字节数或八位字节数?
简单地说,在C和变体中(与wuss java及其虚拟机不同),不同目标上的基元类型的大小可能会有很大的差异,而且除非您使用sizeof是否返回C中类型的字节数或八位字节数?,c,byte,sizeof,word-size,C,Byte,Sizeof,Word Size,简单地说,在C和变体中(与wuss java及其虚拟机不同),不同目标上的基元类型的大小可能会有很大的差异,而且除非您使用stdint.h中定义的固定宽度类型,否则实际上无法保证,即使这样,您的实现也必须支持它们 无论如何,假设(因为在大多数现代机器上,一个字节是一个八位字节,出于联网目的,我假设(ASCII))sizeof返回的数据类型的大小是字节还是八位字节?sizeof总是以字节数的形式返回大小。但根据: 在编程语言C和C++中,一元运算符SIZEOF用于计算任何数据类型的大小,以表示类型
stdint.h
中定义的固定宽度类型,否则实际上无法保证,即使这样,您的实现也必须支持它们
无论如何,假设(因为在大多数现代机器上,一个字节是一个八位字节,出于联网目的,我假设(ASCII))sizeof返回的数据类型的大小是字节还是八位字节?
sizeof
总是以字节数的形式返回大小。但根据:
在编程语言C和C++中,一元运算符SIZEOF用于计算任何数据类型的大小,以表示类型所需的字节数来测量。此上下文中的字节与无符号字符相同,可能大于8位,但这并不常见
回答:
sizeof
返回类型的大小(以字节为单位)
示例:
sizeof(char)
100%保证为1
,但这并不意味着它是一个八位字节(8位)
标准证明: 在6.5.3.4第2点中: sizeof运算符生成其操作数的大小(以字节为单位),它可能是一个 表达式或类型的括号名称。大小由类型决定 操作数。结果是一个整数。如果操作数的类型是可变长度数组 类型,则计算操作数;否则,不计算操作数,结果为 整数常量 应用于具有char、unsigned char或signed char类型的操作数时, (或其合格版本)结果为1。应用于具有数组的操作数时 类型,则结果是应用于操作数时数组中的总字节数) 具有结构或联合类型的,其结果是该对象中的总字节数, 包括内部和尾部填充 此外,在第3.6节第3点中: 字节由连续的位序列组成,其数量由实现定义
sizeof
以字节为单位给出大小。但是,请注意,“字节”是C标准中的一个技术术语,其定义为sizeof(char)==1
根据我自己的经验,在使用奇异的“C”编译器的嵌入式微控制器上工作时,我看到:
sizeof( uint8 )
返回1
sizeof( uint16 )
sizeof( uint32 )
返回1
sizeof( uint16 )
sizeof( uint32 )
返回2
很明显,我是在处理一台最小可寻址实体为16位的机器,因此sizeof不符合C89或C99
我想说,在主流C89和C99兼容系统上,公认的答案是正确的。
不幸的是,“C”编译器仍然可以称为“C”编译器,即使它不符合已有25年历史的标准。我希望这个答案有助于从更奇特的系统角度看待问题。字节,但单个字节(表示为
char
)有char\u位。如果您想要一个T
中的八位字节数,请执行sizeof(T)*字符位/8
。在大多数平台上,CHAR\u BITS
是8
@GManNickGCHAR\u BIT
(没有s):)float octetPercent=sizeof(T)*CHAR\u BIT/8.0;请注意,POSIX和Windows(即,基本上99.999%的非DSP系统)都要求一个字节为八位字节,这个问题主要是出于迂腐/语言律师的目的。你知道了,这就是为什么它说是假设的。你为什么认为这不符合标准?如果char
是16位宽,这正是我所期望的。如果最小的可寻址实体是16位,那么uint8\u t
必须至少占用16位也是有意义的(因此sizeof(uint8\u t)==sizeof(uint16\u t)
)。这是一个很好的答案,它揭示了其中的细微差别。带回家:检查
中的CHAR\u位,并将其与sizeof(CHAR)
进行比较以供参考。其中,在所有严格的技术情况下,字节都是8位,除非(软件说不是)CHAR\u位
不等于8
。由于C从字符位派生字节定义。
在16位最小可寻址大小的情况下,我打赌CHAR\u位
设置为16。你能证实这一点吗?sizeof(char)=1的原因是什么?@ConnorFuhrman它的定义是:3.7.1:字符:单字节字符,而对于sizeof:6.5.3.4,sizeof运算符:[……]当应用于具有char、无符号char或有符号char(或其限定版本)类型的操作数时,结果是1