在新代码中,为什么要使用`int`而不是`int_fast16_t`或`int_fast32_t`作为计数变量?

sni*_*ils 9 c++ int c++11

如果您需要一个计数变量,肯定必须有一个整数必须支持的上限和下限.那么为什么不通过选择适当的(u)int_fastxx_t数据类型来指定这些限制呢?

Jus*_*ica 5

最简单的原因是人们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_tint32_t代替int,因为int在大多数 16 位数据模型和 LP32 32 位数据模型中是 16 位(由 Win16 API 和 Apple Macintoshes),但在 ILP32 32 位数据模型中是 32 位(由 Win32 API 和 *nix 系统使用,有效地使其成为事实上的“标准”32 位模型)。

类似地,struct在 32 位和 64 位系统上具有相同布局的将使用int/int32_tlong long/ int64_tover long,因为long在不同模型中具有不同的大小(LP64 中的 64 位(由 64 位 *nix 使用),32 位在LLP64(由 Win64 API 使用)和 32 位模型)。

请注意,还有第三个 64 位模型,ILP64,其中int64 位;这个模型很少使用(据我所知,它只在早期的 64 位 Unix 系统上使用),但int如果需要与 ILP64 平台的布局兼容性,它将强制使用大小类型。

  • @JustinTime 所以你是说`int` 避免了为你的`int8_t` 使用`typedef` 的需要(或者当你需要更大的东西时花时间重构)并记录你为什么选择`int8_t` 而不是`int16_t`首先。这对我来说似乎很笨拙,所以我想我们必须同意不同意。 (2认同)

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),或者需要节省空间。

  • “`int` 不能是 64 位” - 我不认为这是真的。没有任何内容表明必须存在 8 位、16 位和 32 位类型。 (10认同)
  • 实现者倾向于“更喜欢”提供涵盖 8、16、32 和 64 位大小的预定义类型,但标准并不要求这样做。我使用过 64 位“int”的 C 实现。两者都有 8 位“char”;一个有 32 位“short”,另一个有 64 位“short”。两者都没有 16 位整数类型,后者没有 32 位整数类型。 (5认同)
  • int 同样可能引入难以发现的错误。如果您计算的大小超过了预期的最大值,您应该编写一个断言。没有固定大小的类型会给您带来任何优于其他类型的优势。 (3认同)
  • 没有最低 8 位的限制。您可以拥有 16 位字符,这意味着该系统上的最小类型至少为 16 位。 (2认同)