6.14. 整型
Tip
C++ 内建整型中, 仅使用 int
. 如果程序中需要不同大小的变量, 可以使用 <stdint.h>
中长度精确的整型, 如 int16_t
.如果您的变量可能不小于 2^31 (2GiB), 就用 64 位变量比如 int64_t
. 此外要留意,哪怕您的值并不会超出 int 所能够表示的范围,在计算过程中也可能会溢出。所以拿不准时,干脆用更大的类型。
定义:
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
. 你可以认为int
至少为 32 位, 但不要认为它会多于32
位. 如果需要 64 位整型, 用int64_t
或uint64_t
.对于大整数, 使用int64_t
.不要使用uint32_t
等无符号整型, 除非你是在表示一个位组而不是一个数值, 或是你需要定义二进制补码溢出. 尤其是不要为了指出数值永不会为负, 而使用无符号类型. 相反, 你应该使用断言来保护数据.如果您的代码涉及容器返回的大小(size),确保其类型足以应付容器各种可能的用法。拿不准时,类型越大越好。小心整型类型转换和整型提升(acgtyrant 注:integer promotions, 比如int
与unsigned int
运算时,前者被提升为unsigned int
而有可能溢出),总有意想不到的后果。
关于无符号整数:
有些人, 包括一些教科书作者, 推荐使用无符号类型表示非负数. 这种做法试图达到自我文档化. 但是, 在 C 语言中, 这一优点被由其导致的 bug 所淹没. 看看下面的例子:上述循环永远不会退出! 有时 gcc 会发现该 bug 并报警, 但大部分情况下都不会. 类似的 bug 还会出现在比较有符合变量和无符号变量时. 主要是 C 的类型提升机制会致使无符号类型的行为出乎你的意料.因此, 使用断言来指出变量为非负数, 而不是使用无符号型!
- for (unsigned int i = foo.Length()-1; i >= 0; —i) …