sizeof是否返回C中类型的字节数或八位字节数?

sizeof是否返回C中类型的字节数或八位字节数?,c,byte,sizeof,word-size,C,Byte,Sizeof,Word Size,简单地说,在C和变体中(与wuss java及其虚拟机不同),不同目标上的基元类型的大小可能会有很大的差异,而且除非您使用stdint.h中定义的固定宽度类型,否则实际上无法保证,即使这样,您的实现也必须支持它们 无论如何,假设(因为在大多数现代机器上,一个字节是一个八位字节,出于联网目的,我假设(ASCII))sizeof返回的数据类型的大小是字节还是八位字节?sizeof总是以字节数的形式返回大小。但根据: 在编程语言C和C++中,一元运算符SIZEOF用于计算任何数据类型的大小,以表示类型

简单地说,在C和变体中(与wuss java及其虚拟机不同),不同目标上的基元类型的大小可能会有很大的差异,而且除非您使用
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
@GManNickG
CHAR\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