如果CHAR_BIT不等于8,其他类型的大小是多少?

11

C标准规定sizeof(char)1,无论它实际占据多少位。
如果这些数据类型不同,其他数据类型是否以字节或字符作为度量单位?
基本上,假设CHAR_BIT16,那么sizeof(int16_t)是否等于12

3个回答

16
基本上,假设 CHAR_BIT 是16,则 int16_t 的 sizeof 是否等于1或2。
对象的大小(由 sizeof 运算符产生)以字节为单位计量,在 C 中,一个字节具有 CHAR_BIT 位。
(C99,6.2.6.1p4)“存储在任何其他对象类型的非位字段对象中的值由 n x CHAR_BIT 位组成,其中 n 是该类型对象的大小,以字节为单位。”
如果存在 int16_t 类型,则其宽度恰好为16位且没有填充。这意味着如果 CHAR_BIT == 16,则 sizeof(int16_t) == 1。

已确认,感谢提供 C99 标准的报价。 - EOF
@EOF:更一般地说,**任何类型的存储位数(包括填充位)为sizeof(T) * CHAR_BIT**。对于允许有填充位的类型(不包括unsigned char或指定宽度和大小的类型),您需要检查其范围限制。 - Peter Cordes

12
如果CHAR_BIT为16且存在int16_t,则sizeof(int16_t) == 1。因为在C语言中,每个东西都必须以字节为单位进行测量(并且在此系统上,每个字节将是16位…这就是为什么术语 "八位组" 比 "字节" 更精确的原因),所以int8_t类型将不存在。
在DSP系统和旧超级计算机(早期的Cray系统)中,shortintlong都具有相同的大小,比如64位。

“八位组”并不比“字节”更加“精确”,它们是不同的 - user529758
4
“Octet”更加精确,因为它需要较少的上下文信息。 - Dietrich Epp
我想这应该是这样的,我只是想确认一下。 - EOF

2

类型的大小没有限制;它们只需要能够表示最小范围的值。例如,一个平台拥有所有基本类型都是64位宽度的是完全合法的,每个类型的sizeof都将是1

由于数组需要连续存储,并且相邻的数组元素必须可以被访问而不需要额外的写操作,因此一个平台可能需要选择“大型char”来适应它可以独立寻址的最小内存单元。


这适用于 int_least16_t,但不适用于 int16_t,我理解正确吗? - user529758
@H2CO3:int16_t是一个typedef,而不是一种类型。如果存在适当的类型,则进行定义。 - Kerrek SB
1
我知道,但它不能是32位宽度,对吧?(而int_least16_t可以) - user529758
1
@H2CO3:没错。如果存在合适的类型,则可以选择定义typedefs;还有进一步的要求(无填充,符号表示)。我重新措辞,以明确基本类型。 - Kerrek SB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接