在教材第36页(C语言程序设计第二版)关于int、long、short有如下描述:
short与long两个限定符的引入可以为我们提供满足实际需要的不同长度的整型数。int通常代表特定机器中整数的自然长度。short类型通常为16位,long类型通常为32位,int类型可以为16位或32位。各编译器可以根据硬件特性自主选择合适的类型长度,但要遵循下列限制:
short与int类型至少为16位,而long类型至少为32位,并且short类型不得长于int类型,而int类型不得长于long类型。
从上面的描述我们可以得知不同的数据类型在不同的硬件平台上占用的位宽可能也是不一样的。也就是说同样的代码在不同的硬件平台上运行的时候,可能会由于int、long、short位宽不一样带来软件不兼容的问题。例如,int a = 100000 这条语句在int占用位宽是32位的系统上运行是没有问题,但是在int占用位宽为16位的系统上运行就会出现溢出的问题(16位int的取值范围是 -32768~-32767)
针对上述问题,为了增加代码的移植性,在标准库中定义了stdint.h来重新define了int、long等数据类型。例如在stdint.h中定义:int8_t表示有符号的8位数据类型;uint32_t表示无符号的32位数据类型;类似的还有int32_t、int64_t,uint64_t等。这些重新定义的数据类型屏蔽了硬件不同带来的差异,也就说只要使用了这个类型定义变量,在不同的硬件平台上编译时(不同的硬件平台上stdint.h中关于数据类型的重定义也有不同)就规避了上述软件不兼容的问题。
除此之外,stdint