1

可能重复:
int8_t、int_least8_t 和 int_fast8_t 的区别?

我很困惑。我认为...(如果我错了,请纠正我)

u_int8_t = unsigned short ?
u_int16_t = unsigned int ?
u_int32_t = unsigned long ?
u_int64_t = unsigned long long ?

int8_t = short ?
int16_t = int ?
int32_t = long ?
int64_t = long long ?

那么是什么int_fast8_t意思呢?int_fastN_t? int_least8_t?

4

2 回答 2

2

我写 int 是 16 位的:

u_int8_t = unsigned char  
u_int16_t = unsigned int
u_int32_t = unsigned long int
u_int64_t = unsigned long long int 

int8_t =  char
int16_t = int 
int32_t = long int
int64_t = long long int   

问:“那么 int_fast8_t 是什么意思?int_fastN_t?int_least8_t?”

正如 dan04 在他的回答中所说:

假设您有一个用于 36 位系统的 C 编译器,具有char= 9 位、short= 18 位、int= 36 位和long= 72 位。然后

  • int8_t 不存在,因为没有办法满足只有8 个值位且没有填充的约束。
  • int_least8_t是一个 typedef char。不是shortor int,因为标准要求具有至少 8 位的最小类型。
  • int_fast8_t可以是任何东西。int如果“本机”大小被认为是“快速”,它可能是一个 typedef 。

如果您在Linux大多数情况下,这些都定义在/usr/include/linux/coda.h. 例如

#ifndef __BIT_TYPES_DEFINED__
#define __BIT_TYPES_DEFINED__
typedef signed char       int8_t;
typedef unsigned char       u_int8_t;
typedef short            int16_t;
typedef unsigned short     u_int16_t;
typedef int          int32_t;
typedef unsigned int       u_int32_t;
#endif  

#if defined(DJGPP) || defined(__CYGWIN32__)
#ifdef KERNEL
typedef unsigned long u_long;
typedef unsigned int u_int;
typedef unsigned short u_short;
typedef u_long ino_t;
typedef u_long dev_t;
typedef void * caddr_t;
#ifdef DOS
typedef unsigned __int64 u_quad_t;
#else 
typedef unsigned long long u_quad_t;
#endif
于 2012-12-08T14:06:53.300 回答
2

这些都在 C99 标准(第 7.18 节)中指定。

这些[u]intN_t类型是通用类型(在 ISO C 标准中),其中N表示位宽(8、16 等)。8位不一定是short或,char因为shorts/ints/longs/etc被定义为具有最小范围(不是位宽)并且可能不是二进制补码。

这些较新的类型二进制补码,而不考虑更常见类型的编码,可能是二进制补码或符号/大小(请参阅C 中负数的表示?为什么 SCHAR_MIN 在 C99 中定义为 -127?)。

fast并且least正是它们听起来的样子,快速最小宽度类型和至少给定宽度的类型。

该标准还详细说明了哪些类型是必需的,哪些是可选的。

于 2012-12-08T14:09:54.063 回答