具有已定义宽度的整数类型

Jay*_*tel 0 c types integer c99

在Nuttshell中读到C遇到了一个 具有精确宽度的整数类型(C99) 在此输入图像描述

有人可以解释一下这种数据类型的用途

我在哪里可以在代码中使用这些数据类型

为什么要引入这些数据类型

我是C编程的初学者

Ser*_*sta 6

C现在是一种相当古老的语言(自20世纪70年代初以来),兼容性始终是一个问题.在那些旧时代,整数的大小可能在不同的架构上有所不同.因此sizeof(int)仍然是一个实现细节.标准要求:

  • char 是最小的内存单元,至少有8位 - 所有其他类型的大小都是大小的倍数 char
  • short 至少有16位
  • int至少与short16位一样大并且至少有16位
  • long至少与int32位一样大并且具有至少32位
  • long long至少与long64位一样大并且至少有64位

但是,例如,您无法知道处理32位值的最合适的类型是什么.这就是为什么发明具有精确(或最小)宽度的整数类型的原因.

出于可移植性的原因,C语言对底层机器没有任何假设,这就是为什么具有精确宽度的类型是可选的.话虽如此,它存在于所有常见架构中.


参考:C99的草稿n1256和C11的n1570给出了最小的大小,5.2.4.2.1整数类型的大小可以用更大的值替换实现

下面给出的值应替换为适用于#if预处理指令的常量表达式.此外,除了CHAR_BIT和MB_LEN_MAX之外,以下内容应替换为与根据整数提升转换的对应类型的对象的表达式具有相同类型的表达式.它们的实现定义值的大小(绝对值)应等于或大于显示的值,并带有相同的符号.

  • 最小对象的位数不是位字段(字节)
    CHAR_BIT 8

...

  • unsigned short的对象的最大值int
    USHRT_MAX 65535 // 2 16 - 1

...

  • unsigned int类型的对象的最大值
    UINT_MAX 65535 // 2 16 - 1

...

  • unsigned long的对象的最大值int int
    ULONG_MAX 4294967295 // 2 32 - 1

...

  • unsigned long long int类型的对象的最大值
    ULLONG_MAX 18446744073709551615 // 2 64 - 1