定义宽度为

时间:2018-05-18 07:15:47

标签: c types integer c99

我在Nuttshell中阅读 C 遇到了一个主题 具有精确宽度的整数类型(C99) enter image description here

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

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

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

我是C编程的初学者

2 个答案:

答案 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位。在内部,它可能会映射到(例如)intlong int,具体取决于实现细节。

使用这些类型,程序员可以确保他总是得到一个足够大的变量来进行操作。