是否需要定义所有C固定宽度整数类型或不定义任何类型?

9avjhtql  于 2023-05-28  发布在  其他
关注(0)|答案(3)|浏览(158)

该规范指定了int8_tint16_tint32_tint64_t类型(以及它们的无符号变体),并遵循它们:
这些类型是可选的。
在C中,char是 * 至少 * 8位,shortint是 * 至少 * 16位,long是 * 至少 * 32位,long long是 * 至少 * 64位。如果它们都至少有一定的宽度,并且至少与最小的一个一样大,则很可能存在例如8位类型和32位类型,但没有16位类型,同时满足这些规则。在固定宽度的类型中,是否会出现 'gaps'
“这些类型”是指每一个单独的还是所有的整体?一个一致的实现是否可以定义 * 一些 * 但不是所有的固定宽度类型?例如,我是否需要担心定义了uint8_t,但没有定义uint16_t

nhhxz33t

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的惯例 * 只能怪自己 *。他们可以移植你的代码,这是他们的问题,而不是你的问题。
如果你感觉偏执,你可以添加:

#include <stdio.h>
#if !defined(INT8_MIN) && (__STDC_VERSION__ <= 201710L)
  #error Your computer is too bad for this library.
#endif

注意:即将到来的C23标准将最终放弃对外来和虚构系统的支持。所有整数必须使用2的补码,包括上述3个类别。(来源:C23草案n3096,7.22.1。)

nuypyhwy

nuypyhwy2#

是否需要定义所有C固定宽度整数类型或不定义任何类型?
不可以。一个实现可能有CHAR_BIT == 16,因此只定义了(u)int64_t(u)int32_t(u)int16_t,而没有(u)int8_t
例如,我是否需要担心定义了uint8_t,但没有定义uint16_t
不要担心这样的独角兽。

avwztpqn

avwztpqn3#

假设你使用的是C99或更高版本,并且包含<stdint.h>,那么你应该能够使用相应的宏来确定哪些类型可用:INTn_MAXINTn_MINUINTn_MAX(其中n为8、16、32或64)。

相关问题