我在Nuttshell中阅读 C 遇到了一个主题 具有精确宽度的整数类型(C99)
有人可以解释一下这种数据类型的用途
我在哪里可以在代码中使用这些数据类型
为什么要引入这些数据类型
我是C编程的初学者
答案 0 :(得分:6)
C现在是一种相当古老的语言(自20世纪70年代初以来),兼容性始终是一个问题。在那些旧时代,整数的大小可能在不同的架构上有所不同。因此,sizeof(int)
仍然是一个实现细节。标准要求:
char
是最小的内存单元,至少有8位 - 所有其他类型的大小都是char
short
至少有16位int
至少与short
一样大,且至少有16位long
至少与int
一样大,至少有32位long long
至少与long
一样大,并且至少有64位但是,例如,您无法知道处理32位值的最合适的类型是什么。这就是为什么发明具有精确(或最小)宽度的整数类型的原因。
出于可移植性的原因,C语言对底层机器没有任何假设,这就是为什么具有精确宽度的类型是可选的。话虽如此,它存在于所有常见架构中。
参考文献:C99的草稿n1256和C11的n1570草案给出了最小的尺寸,5.2.4.2.1整数类型的大小可以用更大的值替换实现
下面给出的值应替换为适用于#if的常量表达式 预处理指令。而且,除了CHAR_BIT和MB_LEN_MAX之外 以下内容应替换为与a相同类型的表达式 表达式,它是根据整数转换的相应类型的对象 促销活动。它们的实现定义值的大小应相等或更大 (绝对值)显示的那些,具有相同的符号。
- 不是比特字段(字节)的最小对象的比特数
CHAR_BIT 8...
- unsigned short int类型对象的最大值 USHRT_MAX 65535 // 2 16 - 1
...
- unsigned int类型对象的最大值 UINT_MAX 65535 // 2 16 - 1
...
- unsigned long int类型的对象的最大值 ULONG_MAX 4294967295 // 2 32 - 1
...
- unsigned long long int类型对象的最大值 ULLONG_MAX 18446744073709551615 // 2 64 - 1
答案 1 :(得分:3)
变量可以有不同的大小,具体取决于硬件。
在微处理器和旧处理器上有8位和16位架构(现在常见的PC有或多或少的64位架构,而标准在几年前是32位)。这些"较小"变量然后是人们从Java或现代PC中获得的期望。
例如,int
只能是16位。如果代码从期望它为32位的系统移植,这可能会导致问题,因为它可能导致整数溢出。
为了解决这个问题,我们声明这些新类型具有独立于系统的实现。
int32_t
总是32位。在内部,它可能会映射到(例如)int
或long int
,具体取决于实现细节。
使用这些类型,程序员可以确保他总是得到一个足够大的变量来进行操作。