具有定义宽度的整数类型
Integer types with defined width
我正在阅读 C in a Nuttshell 遇到了一个主题
具有精确宽度的整数类型 (C99)
谁能解释一下这个数据类型有什么用
我在哪里可以在代码中使用这种数据类型
为什么要引入这种数据类型
我是C编程初学者
一个变量可以有不同的大小,具体取决于硬件。
在微控制器和较旧的处理器上有 8 位和 16 位架构(如今的普通 PC 或多或少具有 64 位架构,而几年前的标准是 32 位)。这些有 "smaller" 个变量,然后是来自 Java 或现代 PC 时人们所期望的。
例如 int
只能是 16 位。如果代码是从期望它是 32 位的系统移植的,这可能会导致问题,因为它可能导致整数溢出。
为了解决这个问题,声明了具有系统独立实现的新类型。
int32_t
始终是 32 位。在内部,它可能映射到(例如)int
或 long int
,具体取决于实施细节。
使用这些类型,程序员可以确保他总是获得足够大的变量来进行操作。
C 现在是一种相当古老的语言(自 1970 年代初以来),兼容性一直是一个问题。在过去,整数的大小在不同的架构上可能不同。因此 sizeof(int)
仍然是一个实现细节。标准要求:
char
是最小的内存单元,至少有 8 位 - 所有其他类型的大小都是 char
的倍数
short
至少有 16 位
int
至少与 short
一样大并且至少有 16 位
long
至少与 int
一样大并且至少有 32 位
long long
至少与 long
一样大并且至少有 64 位
但是例如,您无法知道什么类型最适合处理 32 位值。这就是发明 具有精确(或最小)宽度的整数类型 的原因。
出于可移植性的原因,C 语言不对底层机器做任何假设,这就是为什么具有 exact 宽度的类型是可选的。也就是说,它们存在于所有常见的架构中。
参考资料:C99 的草案 n1256 和 C11 的 n1570 给出了实现可以用更大的值替换的最小大小 5.2.4.2.1 整数类型的大小
The values given below shall be replaced by constant expressions suitable for use in #if
preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, the
following shall be replaced by expressions that have the same type as would an
expression that is an object of the corresponding type converted according to the integer
promotions. Their implementation-defined values shall be equal or greater in magnitude
(absolute value) to those shown, with the same sign.
- number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8
...
- maximum value for an object of type unsigned short int
USHRT_MAX 65535 // 216 - 1
...
- maximum value for an object of type unsigned int
UINT_MAX 65535 // 216 - 1
...
- maximum value for an object of type unsigned long int
ULONG_MAX 4294967295 // 232 - 1
...
- maximum value for an object of type unsigned long long int
ULLONG_MAX 18446744073709551615 // 264 - 1
我正在阅读 C in a Nuttshell 遇到了一个主题
具有精确宽度的整数类型 (C99)
谁能解释一下这个数据类型有什么用
我在哪里可以在代码中使用这种数据类型
为什么要引入这种数据类型
我是C编程初学者
一个变量可以有不同的大小,具体取决于硬件。
在微控制器和较旧的处理器上有 8 位和 16 位架构(如今的普通 PC 或多或少具有 64 位架构,而几年前的标准是 32 位)。这些有 "smaller" 个变量,然后是来自 Java 或现代 PC 时人们所期望的。
例如 int
只能是 16 位。如果代码是从期望它是 32 位的系统移植的,这可能会导致问题,因为它可能导致整数溢出。
为了解决这个问题,声明了具有系统独立实现的新类型。
int32_t
始终是 32 位。在内部,它可能映射到(例如)int
或 long int
,具体取决于实施细节。
使用这些类型,程序员可以确保他总是获得足够大的变量来进行操作。
C 现在是一种相当古老的语言(自 1970 年代初以来),兼容性一直是一个问题。在过去,整数的大小在不同的架构上可能不同。因此 sizeof(int)
仍然是一个实现细节。标准要求:
char
是最小的内存单元,至少有 8 位 - 所有其他类型的大小都是char
的倍数
short
至少有 16 位int
至少与short
一样大并且至少有 16 位long
至少与int
一样大并且至少有 32 位long long
至少与long
一样大并且至少有 64 位
但是例如,您无法知道什么类型最适合处理 32 位值。这就是发明 具有精确(或最小)宽度的整数类型 的原因。
出于可移植性的原因,C 语言不对底层机器做任何假设,这就是为什么具有 exact 宽度的类型是可选的。也就是说,它们存在于所有常见的架构中。
参考资料:C99 的草案 n1256 和 C11 的 n1570 给出了实现可以用更大的值替换的最小大小 5.2.4.2.1 整数类型的大小
The values given below shall be replaced by constant expressions suitable for use in #if preprocessing directives. Moreover, except for CHAR_BIT and MB_LEN_MAX, the following shall be replaced by expressions that have the same type as would an expression that is an object of the corresponding type converted according to the integer promotions. Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.
- number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8...
- maximum value for an object of type unsigned short int
USHRT_MAX 65535 // 216 - 1...
- maximum value for an object of type unsigned int
UINT_MAX 65535 // 216 - 1...
- maximum value for an object of type unsigned long int
ULONG_MAX 4294967295 // 232 - 1...
- maximum value for an object of type unsigned long long int
ULLONG_MAX 18446744073709551615 // 264 - 1