标准和禁食整数当量

时间:2016-08-30 10:47:58

标签: c language-lawyer

标准为标准无符号类型提供以下最小位宽:

unsigned char >= 8
unsigned short >= 16
unsigned int >= 16
unsigned long >= 32
unsigned long long >= 64

(隐含地,通过指定最小最大值)。

这是否意味着以下等同?

unsigned char == uint_fast8_t
unsigned short == uint_fast16_t
unsigned int == uint_fast16_t
unsigned long == uint_fast32_t
unsigned long long == uint_fast64_t

3 个答案:

答案 0 :(得分:3)

不,因为编译器选择默认“原始数据类型”的大小为给定系统的方便。方便的含义易于使用由于各种原因:整数范围,其他整数类型的大小,向后兼容性等。它不一定被选为最快的。

例如,实际上unsigned int在32位系统上的大小为32,在64位系统上的大小为32。但在64位系统上,uint_fast32_t可能是64位。

只需查看unsigned charuint_fast8_t实践中最常用的尺寸:

Data bus   unsigned char   uint_fast8_t
8 bit      8 bit           8 bit
16 bit     8 bit           16 bit
32 bit     8 bit           32 bit
64 bit     8 bit           32/64 bit

就是这样,因为为方便起见,我们需要一个字节类型来处理。然而,优化编译器可能会将此unsigned char字节放在对齐的地址并将其读取为32位访问,因此尽管数据类型的实际大小可能会执行优化。

答案 1 :(得分:1)

我不知道这是否是问题的答案,但(至少在glibc),int_fastx_tuint_fastx_t typedef取决于单词尺寸:

/* Fast types.  */

/* Signed.  */
typedef signed char     int_fast8_t;
#if __WORDSIZE == 64
typedef long int        int_fast16_t;
typedef long int        int_fast32_t;
typedef long int        int_fast64_t;
#else
typedef int         int_fast16_t;
typedef int         int_fast32_t;
__extension__
typedef long long int       int_fast64_t;
#endif

/* Unsigned.  */
typedef unsigned char       uint_fast8_t;
#if __WORDSIZE == 64
typedef unsigned long int   uint_fast16_t;
typedef unsigned long int   uint_fast32_t;
typedef unsigned long int   uint_fast64_t;
#else
typedef unsigned int        uint_fast16_t;
typedef unsigned int        uint_fast32_t;
__extension__
typedef unsigned long long int  uint_fast64_t;
#endif

答案 2 :(得分:0)

基本上你是对的,但不是法律上的。 int意味着"自然"系统的整数类型。实际上,它通常在32位和64位系统上为32位,在小型系统上为16位,因为64位整数会破坏太多接口。所以int本质上就是fast_32_t。 然而,它不能保证。而像8位和16位这样的较小类型可能具有更快的32位当量。但是在实践中使用int可能会给你最快的代码。