【单选】下列 C++ 数据类型中,能够精确存储 10^18 + 1 这个整数的是( )。
看各类型的"取值范围":int 是 32 位(约 ±2.1e9),long long 是 64 位(约 ±9.2e18),而 float/double 是浮点数,尾数分别只有 23/52 位,存不下这么大的整数。
最常见的是误以为 double 能精确表示任意"大数"——它只有 52 位尾数,只能精确表示不超过 2^53≈9.0e15 的整数;另一类错误是把 int 与 long long 的位数记反(把 int 当成 64 位)。
本题考查 C++ 基本数据类型的取值范围与表示精度,属于「数据表示」板块的基础送分题。
| 选项 | 类型 | 典型范围 / 精度 | 能否精确存储 10^18+1 |
|---|---|---|---|
| A | float | 4 字节,尾数 23 位,约 7 位有效十进制数字 | ✗ 相差十亿倍以上 |
| B | long long | 8 字节,约 ±9.2×10^18 | ✓ 可以精确存储 |
| C | double | 8 字节,尾数 52 位,仅能精确表示 ≤ 2^53 ≈ 9.0×10^15 的整数 | ✗ 会丢精度 |
| D | int | 4 字节,约 ±2.1×10^9 | ✗ 直接溢出 |
10^18 + 1 = 1000000000000000001,需要约 60 个二进制位。long long 是 64 位有符号整数,上限 2^63−1 ≈ 9.22×10^18,完全放得下,因此选 B。
double 看起来"能存很大很大的数"(它连 1e308 都能表示),但那是浮点语义:64 位里有 1 位符号、11 位指数、52 位尾数。尾数只有 52 位,意味着它只能精确表示 2^53 以内的整数;超过之后相邻两个可表示的 double 之间的间隔会大于 1,10^18 附近的间隔是 128,所以 10^18+1 会被"四舍五入"成邻近的偶数,根本区分不出来。
int 约 ±2.1×10^9(21 亿),unsigned int 约 4.3×10^9;long long 约 ±9.2×10^18;double 精确整数上限 2^53 ≈ 9.0×10^15(约 9 千万亿);