我确实认为这个头衔最初可能听起来很傻,但是,请跟我说一下。 :)
自从我开始使用size_t
和ptrdiff_t
以来,我一直没有使用int
,我记得很久。
我记得最近使用的唯一整数数据类型属于以下类别之一:
(无符号)整数与某些内存数据结构的索引相关联(例如vector
)。
几乎总是,最合适的类型是size_t
(或...::size_type
,如果你要加倍的话。)
即使整数实际代表一个索引,通常它仍然与某个索引关联,所以size_t
仍然合适。
size_t
的签名版本。在许多情况下,最合适的类型似乎是ptrdiff_t
,因为通常在需要时,你正在使用迭代器 - 因此size_t
和ptrdiff_t
都是适合他们。
long
。我偶尔需要_InterlockedIncrement
(引用计数)。
(unsigned
)long long
,用于保存文件大小。
unsigned int
或unsigned long
,对于“计算”目的非常有用(例如每100万次迭代,更新用户界面)。
unsigned char
用于对内存进行原始字节级访问
(旁注:我从未找到signed char
的用途。)
intptr_t
和uintptr_t
偶尔存储操作系统句柄,指针等。
int
的一个特殊方面,重要的是你不应该溢出它(因为它是未定义的行为),所以你甚至不能可靠地使用它来计算 - 特别是如果你的编译器将它定义为16位。
那么,何时,你应该使用int
(除非你的依赖已经要求它)?
现在有没有真正的用途,至少在新编写的便携式代码中?
答案 0 :(得分:9)
最重要的原因是什么 - 可读性。 (和简单的数学)
long weeklyHours = daysWorked * hoursPerDay;
“好的......但话又说回来,一个人每周实际工作多少,我们需要一个long
”
size_t weeklyHours = daysWorked * hoursPerDay;
“等等......我们使用weeklyHours
迭代向量吗?”
unsigned int weeklyHours = daysWorked * hoursPerDay;
“足够清楚。” - 错误的可能来源,如果其中任何一个可能是否定的(逻辑的一部分 - 它可能是一种解释或离开的方式,不重要)
int weeklyHours = daysWorked * hoursPerDay;
“好的,足够简单。我得到了它正在做的事情。”
答案 1 :(得分:6)
Luchian有一些非常好的可读性点,我将添加一些技术性的点:
int
选择一个有效处理的大小,而long
可能不会(每个操作冒更多CPU周期,机器代码更多字节,需要更多寄存器等) )abs(a - b)
在数学上看起来正确但在b
>时没有给出直观的结果a
他们是未签名的int second_delta = (x.seconds - y.seconds) + (x.minutes - y.minutes) * 60;
if (pending - completed > 1) kick_off_threads()
-1
:对于无符号类型,这将被转换为最大可能值,但这可能导致误解和编码错误(例如if (x >= 0)
测试非-sentinel)此外,对于有符号整数和无符号整数之间的隐式转换有很多空间 - 重要的是要理解无符号类型很少有助于强制执行“非负”不变量:如果这是吸引力的一部分,那么你最好不要写一个带有构造函数的类和强制执行不变量的运算符。
在可读性方面,int
表示一个明显跨越问题域的数字的一般需求 - 它可能过多,但在机器代码操作和CPU周期中已知便宜,因此它的首选类型是一般积分存储。如果你开始使用说unsigned char
来存储某人的年龄 - 它不仅不能很好地与operator<<(std::ostream&...)
一起使用,而且还会引发一些问题,例如“这里是否需要节省内存?” (特别是对基于堆栈的变量感到困惑),“是否有意将此视为用于I / O或IPC目的的二进制数据?”,甚至“它是以ASCII存储的已知单位数年龄?”。如果事情最终可能会出现在寄存器中,int
是一个自然的大小。
答案 2 :(得分:0)
假设您正在实施银行帐户计划。如果你撤回太多(一些账户允许你,并且罚款),那么你需要以某种方式表示负值。
答案 3 :(得分:0)
我终于找到了一个好的用例:
int
是存储整数对数的理想选择,例如地图上的缩放级别。
short
通常没有足够的精度(平滑鼠标滚轮的旋转可以非常精确),long
通常比我们需要的更精确。
我们肯定需要负值,所以我们不应该使用无符号类型。因此int
适合该法案。