定义: C++没有指定整型的大小, 通常人们认为 short
是 16 位, int
是 32 位, long
是 32 位, long long
是 64 位。
优点:保持声明统一。
缺点: C++ 中整型大小因编译器和体系结构的不同而不同。
结论:
<stdint.h> 定义了 int16_t
、 uint32_t
、 int64_t
等整型,在需要确定大小的整型时可以使用它们代替 short
、 unsigned long long
等,在 C 整型中,只使用 int
。适当情况下,推荐使用标准类型如 size_t
和 ptrdiff_t
。
对整数来说,最常使用的通常不会用到太大,如循环计数等,可以使用普通的 int
。 你可以认为 int
至少为 32 位,但不要认为它会多于 32 位,需要 64 位整型的话,可以使用 int64_t
或 uint64_t
。
对于大整数,使用int64_t。
不要使用 uint32_t
等无符号整型,除非你是在表示一个位组( bit pattern ) 而不是一个数值。即使数值不会为负值也不要使用无符号类型,使用断言( assertion)来保护数据 —— 计算机只会根据变量、返回值等有无符号确定数值正负,仍然无法确定对错。
无符号整型:
不要使用无符号类型表示非负数。
一个常见的 bug:
for (unsigned int i = foo.Length()-1; i >= 0; --i)
{
// ...
}
上面代码永远不会终止!有时 gcc 会发现该 bug 并报警,但通常不会。类似的 bug 还会出现在比较有符合变量和无符号变量时,主要是 C 的类型提升机制( type-promotion scheme, C 语言中各种内建类型之间的提升转换关系) 会致使无符号类型的行为出乎你的意料。
因此,使用断言声明变量为非负数,不要使用无符号型。