如果您需要一个计数变量,肯定必须有一个整数必须支持的上限和下限.那么为什么不通过选择适当的(u)int_fastxx_t数据类型来指定这些限制呢?
最简单的原因是人们int比 C++11 中引入的附加类型更习惯,而且它是语言的“默认”整数类型(就像 C++ 一样);该标准规定[basic.fundamental/2]:
普通整数具有执行环境46架构建议的自然大小;提供其他有符号整数类型以满足特殊需要。
46) 也就是说,足够大以包含
INT_MIN和范围内的任何值INT_MAX,如标题 中所定义<climits>。
因此,每当需要通用整数时,不需要具有特定范围或大小,程序员往往只使用int. 虽然使用其他类型可以更清楚地传达意图(例如, usingint8_t表示值不应超过127),但 usingint也传达了这些细节对手头的任务并不重要,同时提供一点余地来捕捉超过的值您所需的范围(例如,如果系统使用模运算处理有符号溢出,int8_t则将313视为57,从而使无效值更难以排除故障);通常,在现代编程中,它要么表示该值可以在系统的字长内表示(即int应该表示),或者该值可以在 32 位内表示(int在 x86 和 x64 平台上几乎总是大小)。
大小类型也有一个问题,即(理论上)最知名的类型,即intX_t行,仅在支持正好X 位大小的平台上定义。虽然int_leastX_t保证在所有平台上都定义了类型,并且保证至少是 X 位,但如果不需要,很多人不希望输入那么多,因为当您需要指定时它会累加类型经常。[您不能使用auto,因为它将整数文字检测为ints。这可以通过创建用户定义的文字运算符来缓解,但这仍然需要更多的时间来输入。] 因此,int如果这样做是安全的,它们通常会使用。
或者简而言之,int旨在成为正常操作的首选类型,而其他类型则旨在在异常情况下使用。许多程序员出于习惯坚持这种心态,并且仅在明确要求特定范围和/或大小时才使用大小类型。这也相对较好地传达了意图;int表示“数字”,intX_t表示“总是适合 X 位的数字”。
int由于 32 位和 64 位平台通常都使用 32 位,因此演变为非正式的“32 位整数”并没有帮助int。许多程序员很可能希望int在现代总是至少 32 位,以至于如果他们必须为不支持 32 位int的平台编程,很容易在后面咬他们。
相反,当明确需要特定范围或大小时,通常使用 sized 类型,例如当定义struct需要在具有不同数据模型的系统上具有相同布局时。在内存有限的情况下,使用可以完全包含所需范围的最小类型,它们也可以证明是有用的。
例如,struct打算在 16 位和 32 位系统上具有相同布局的A将使用int16_t或int32_t代替int,因为int在大多数 16 位数据模型和 LP32 32 位数据模型中是 16 位(由 Win16 API 和 Apple Macintoshes),但在 ILP32 32 位数据模型中是 32 位(由 Win32 API 和 *nix 系统使用,有效地使其成为事实上的“标准”32 位模型)。
类似地,struct在 32 位和 64 位系统上具有相同布局的将使用int/int32_t或long long/ int64_tover long,因为long在不同模型中具有不同的大小(LP64 中的 64 位(由 64 位 *nix 使用),32 位在LLP64(由 Win64 API 使用)和 32 位模型)。
请注意,还有第三个 64 位模型,ILP64,其中int64 位;这个模型很少使用(据我所知,它只在早期的 64 位 Unix 系统上使用),但int如果需要与 ILP64 平台的布局兼容性,它将强制使用大小类型。
gna*_*729 -3
有几个原因。第一,这些长名称使代码的可读性较差。第二,你可能会引入很难发现的错误。假设您使用了 int_fast16_t 但您确实需要数到 40,000。该实现可能使用 32 位并且代码工作得很好。然后,您尝试在使用 16 位的实现上运行代码,您会发现很难发现的错误。
注意:在 C / C++ 中,您有 char、short、int、long 和 long long 类型,它们必须涵盖 8 到 64 位,因此 int 不能是 64 位(因为 char 和 Short 不能涵盖 8、16 和 32 位),甚至如果 64 位是自然字大小。例如,在 Swift 中,Int 是自然整数大小,可以是 32 位,也可以是 64 位,并且可以使用 Int8、Int16、Int32 和 Int64 来表示显式大小。Int 是最好的类型,除非您绝对需要 64 位(在这种情况下您使用 Int64),或者需要节省空间。
| 归档时间: |
|
| 查看次数: |
2277 次 |
| 最近记录: |