该规范指定了int8_t
int16_t
int32_t
和int64_t
类型(以及它们的无符号变体),并遵循它们:
这些类型是可选的。
在C中,char
是 * 至少 * 8位,short
和int
是 * 至少 * 16位,long
是 * 至少 * 32位,long long
是 * 至少 * 64位。如果它们都至少有一定的宽度,并且至少与最小的一个一样大,则很可能存在例如8位类型和32位类型,但没有16位类型,同时满足这些规则。在固定宽度的类型中,是否会出现 'gaps'?
“这些类型”是指每一个单独的还是所有的整体?一个一致的实现是否可以定义 * 一些 * 但不是所有的固定宽度类型?例如,我是否需要担心定义了uint8_t
,但没有定义uint16_t
?
3条答案
按热度按时间nhhxz33t1#
stdint.h
是所有编译器都必须实现的头文件,包括独立实现(嵌入式系统编译器)。C标准将固定宽度类型分为3类:int32_t
。如果编译器/系统支持8、16、32或64位类型中的任何一种,并且具有2的补码并且没有填充位,则这些类型是强制性的。否则,如果编译器/系统是非常奇特的,这些类型是可选的-这是你引用的文本,但现在放在正确的上下文中。ISO C17说(7.20.1),强调我的:
这些类型是可选的。然而,如果一个实现提供了宽度为8、16、32、或64位的整数类型,没有填充位,并且(对于有符号类型)具有二进制补码表示,它应该定义相应的typedef名称。
int_least32_t
。所有编译器都必须实现这些。int_fast32_t
。所有编译器都必须实现这些。因此,在固定宽度类型中可能存在“间隙”?
理论上是的存在一些具有16位字节的外来系统(来自TI的各种或多或少功能失调的DSP)-这些不支持
int8_t
,所以如果你愿意的话,那里有一个“差距”。也存在一些支持24位类型的系统。4位微型微控制器也一样。“这些类型”是指每一个单独的还是所有的整体?
单独地,如上面引用的。8、16、32、或64位。
例如,我是否需要担心定义了uint8_t而没有定义uint16_t?
您根本不需要担心这些类型不受支持。缺乏对外来/虚构/功能失调的DSP系统的可移植性是一个 * 特性 * 而不是一个问题。担心这些系统的可移植性是一种巨大的时间浪费。任何决定1)首先使用这样一个异国情调的DSP 2)决定为它编写C而不是asm的人,asm是DSP的惯例 * 只能怪自己 *。他们可以移植你的代码,这是他们的问题,而不是你的问题。
如果你感觉偏执,你可以添加:
注意:即将到来的C23标准将最终放弃对外来和虚构系统的支持。所有整数必须使用2的补码,包括上述3个类别。(来源:C23草案n3096,7.22.1。)
nuypyhwy2#
是否需要定义所有C固定宽度整数类型或不定义任何类型?
不可以。一个实现可能有
CHAR_BIT == 16
,因此只定义了(u)int64_t
、(u)int32_t
和(u)int16_t
,而没有(u)int8_t
。例如,我是否需要担心定义了
uint8_t
,但没有定义uint16_t
?不要担心这样的独角兽。
avwztpqn3#
假设你使用的是C99或更高版本,并且包含
<stdint.h>
,那么你应该能够使用相应的宏来确定哪些类型可用:INTn_MAX
、INTn_MIN
和UINTn_MAX
(其中n为8、16、32或64)。