如果您需要一个计数变量,肯定必须有一个整数必须支持的上限和下限。那么为什么不通过选择合适的(u)int_fastxx_t数据类型来指定这些限制呢?
答案 0 :(得分:4)
最简单的原因是人们比C ++ 11中引入的其他类型更习惯于int
,并且它是语言"默认"整数类型(C ++就有一个);该标准在[basic.fundamental/2]
中指定:
普通的int具有执行环境 46 的体系结构所建议的自然大小;提供其他有符号整数类型以满足特殊需求。
46)即足够大,可以包含
INT_MIN
和INT_MAX
范围内的任何值,如标题<climits>
中所定义。
因此,只要需要一个通用整数,并不需要具有特定的范围或大小,程序员往往只使用int
。使用其他类型可以更清晰地传达意图(例如,使用int8_t
表示该值不应超过127
),使用int
也会传达这些细节并不重要对于手头的任务,同时提供一些余地来捕捉超出所需范围的值(例如,如果系统使用模运算处理带符号的溢出,int8_t
会将313
视为{{ 1}},使无效值更难以排除故障);通常,在现代编程中,它或者表示该值可以在系统的字大小(57
应该表示)中表示,或者该值可以在32位内表示(这是在x86和x64平台上几乎总是int
的大小。)
大小类型也存在这样的问题:(理论上)最知名的那些int
行仅在支持完全 X位大小的平台上定义。虽然intX_t
类型保证在所有平台上定义,并且保证至少为X位,但是如果不是必须的话,很多人都不想输入那么多,因为当你需要经常指定类型时,它会相加。 [您不能使用int_leastX_t
,因为它会将整数文字检测为auto
。这可以通过制作用户定义的文字运算符来缓解,但仍然需要更多的时间来输入。]因此,如果安全的话,他们通常会使用int
。
或者简而言之,int
旨在成为正常操作的首选类型,其他类型旨在用于超常情况。许多程序员都习惯于坚持这种心态,只有在明确要求特定范围和/或大小时才使用大小类型。这也相对较好地传达了意图; int
表示&#34;数字&#34;,int
表示&#34;数字始终适合X位&#34;。
由于32位和64位平台通常使用32位,因此intX_t
已演变为非正式意味着32位整数&#34;并没有帮助。位int
s。许多程序员很可能希望int
在现代时代始终至少为32位,如果他们必须为平台编程,那么它很容易在后面咬它们。 em>不支持32位int
s。
相反,通常在明确要求特定范围或大小时使用大小类型,例如在定义具有不同数据模型的系统上需要具有相同布局的int
时。当使用可以完全包含所需范围的最小类型时,它们在使用有限的内存时也可以证明是有用的。
例如,要在16位和32位系统上使用相同布局的struct
将使用struct
或int16_t
而不是int32_t
,因为int
在大多数16位数据模型中为16位,LP32为32位数据模型(由Win16 API和Apple Macintoshes使用),但在ILP32 32位数据模型中为32位(由Win32使用) API和* nix系统,有效地使其成为事实上的标准&#34; 32位模型。
同样,要在32位和64位系统上使用相同布局的int
将使用struct
/ int
或int32_t
/ long long
超过int64_t
,因为long
在不同模型中具有不同的大小(LP64中的64位(由64位* nix使用),LLP64中的32位(由Win64 API使用)和32位型号)。
注意,还有第三个64位模型ILP64,其中long
是64位;这个模型很少使用(据我所知,它只用于早期的64位Unix系统),但是如果需要与ILP64平台的布局兼容性,则要求使用大小超过int
的类型。
答案 1 :(得分:-3)
有几个原因。其一,这些长名称使代码可读性降低。二,你可能会介绍真的很难找到bug。假设你使用了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,或者如果您需要节省空间。