当 C 或 C++ 程序员(以下以第二人称)选择整型变量的大小时,通常会遇到以下情况之一:
- You know (at least roughly) the valid range for the variable, based on the real-world value it represents. For example,
-
numPassengersOnPlane
航空公司预订系统中应容纳largest http://planes.findthebest.com/l/242/Airbus-A380-800支持飞机,因此至少需要 10 位。 (向上舍入为 16。)
-
numPeopleInState
在美国人口普查制表程序中需要适应人口最多的州 http://en.wikipedia.org/wiki/California(目前约为3800万),因此至少需要26位。 (向上舍入为 32。)
在这种情况下,您需要以下语义int_leastN_t
from <stdint.h>
。程序员通常使用精确宽度intN_t
在这里,从技术上讲他们不应该这样做;然而,8/16/32/64 位机器如今占据绝对主导地位,以至于这种区别仅仅是学术上的。
You could使用标准类型并依赖诸如“int
必须至少为 16 位”,但这样做的缺点是没有标准maximum整数类型的大小。如果int
当您实际上只需要 16 位时,恰好是 32 位,那么您就不必要地将数据大小增加了一倍。在许多情况下(见下文),这不是问题,但如果您有一个数组millions的数字,那么你会得到很多页面错误。
- 您的数字不需要那么大,但出于效率原因,您需要一种快速的“本机”数据类型,而不是可能需要在位掩码或零/符号扩展上浪费时间的小数据类型。
这是int_fastN_t
输入<stdint.h>
。然而,通常只使用内置的int
这里,在 16/32 位时代的语义是int_fast16_t
。它不是 64 位系统上的本机类型,但通常足够好。
- 该变量是内存量、数组索引或强制转换指针,因此需要一个取决于可寻址内存量的大小。
这对应于 typedefsize_t
, ptrdiff_t
, intptr_t
等你have在这里使用 typedefs 因为有no保证内存大小的内置类型。
- 该变量是使用以下命令序列化到文件的结构的一部分
fread
/fwrite
,或从具有自己的固定宽度数据类型的非 C 语言(Java、COBOL 等)调用。
在这些情况下,您确实需要精确宽度的类型。
通常,这种方法效果很好。
所以,总而言之,所有的 typedef 都来自<stdint.h>
有他们的用例。然而,内置类型的用途受到限制,原因如下:
- Lack of maximum这些类型的尺寸。
- 缺乏原生 memsize 类型。
- 64 位系统上的 LP64(在类 Unix 系统上)和 LLP64(在 Windows 上)数据模型之间任意选择。
至于为什么会有这样的many固定宽度的冗余 typedef (WORD
, DWORD
, __int64
, gint64
, FINT64
等)和memsize(INT_PTR
, LPARAM
, VPTRDIFF
等)整数类型,主要是因为<stdint.h>
C 的发展较晚,人们仍在使用不支持它的旧编译器,因此库需要定义自己的编译器。 C++ 有这么多字符串类的原因也是如此。