最简单的原因是人们更习惯于int,而不是 C++11 中引入的其他类型,而且它是语言的“默认”整数类型(C++ 也有);该标准在[basic.fundamental/2] 中指定:
普通整数具有执行环境架构所建议的自然大小46;提供其他有符号整数类型以满足特殊需要。
46) 即大到足以包含INT_MIN 和INT_MAX 范围内的任何值,如标头<climits> 中所定义。
因此,当需要一个通用整数时,不需要有特定的范围或大小,程序员倾向于只使用int。虽然使用其他类型可以更清楚地传达意图(例如,使用int8_t 表示该值不应超过127),但使用int 也可以传达这些细节对于手头的任务并不重要,同时提供一点余地来捕获超出所需范围的值(例如,如果系统使用模运算处理有符号溢出,int8_t 会将313 视为57,从而使无效值更难排除故障);通常,在现代编程中,它要么表示该值可以在系统的字长(int 应该表示)内表示,要么表示该值可以在 32 位内表示(几乎总是 @ 987654335@ 在 x86 和 x64 平台上)。
Sized 类型还存在一个问题,即(理论上)最知名的 intX_t 行仅在支持 完全 X 位大小的平台上定义。虽然int_leastX_t 类型保证在所有平台上都被定义,并且保证至少是 X 位,但很多人不想在不需要时输入那么多,因为当你需要经常指定类型。 [你不能使用auto,因为它将整数文字检测为ints。这可以通过使用用户定义的文字运算符来缓解,但这仍然需要更多的时间来输入。]因此,如果这样做是安全的,他们通常会使用int。
或者简而言之,int 旨在成为正常操作的首选类型,而其他类型旨在用于异常情况。许多程序员出于习惯而坚持这种心态,并且仅在明确需要特定范围和/或大小时才使用大小类型。这也相对较好地传达了意图; int 表示“数字”,intX_t 表示“总是适合 X 位的数字”。
int 已演变为非正式的“32 位整数”的意思并没有帮助,因为 32 位和 64 位平台通常使用 32 位 ints。很可能许多程序员希望int 在现代总是至少为 32 位,以至于如果他们必须为 不 支持 32 位 ints.
相反,大小类型通常在明确需要特定范围或大小时使用,例如在定义需要在具有不同数据模型的系统上具有相同布局的struct 时。当使用有限的内存时,它们也可以证明是有用的,使用可以完全包含所需范围的最小类型。
例如,打算在 16 位和 32 位系统上具有相同布局的 struct 将使用 int16_t 或 int32_t 而不是 int,因为 int 在大多数情况下是 16 位16 位数据模型和 LP32 32 位数据模型(由 Win16 API 和 Apple Macintoshes 使用),但 ILP32 32 位数据模型中的 32 位(由 Win32 API 和 *nix 系统使用,有效地使其成为事实上的“标准”32 位模型)。
同样,在 32 位和 64 位系统上具有相同布局的 struct 将使用 int/int32_t 或 long long/int64_t 而不是 long,这是由于 long在不同的模型中具有不同的大小(LP64 中的 64 位(由 64 位 *nix 使用)、LLP64 中的 32 位(由 Win64 API 使用)和 32 位模型)。
注意还有第三种64位模型,ILP64,其中int是64位;此模型很少使用(据我所知,它仅用于早期的 64 位 Unix 系统),但如果需要与 ILP64 平台的布局兼容,则要求使用大小超过 int 的类型。