CSP-J 入门级 · CSP 2026 入门级第一轮 第 1 题

选择题 · 答案 B · 考点:基本数据类型、数据表示、变量与常量

← 整套速查表 CSP-J 入门级 全部真题

题目

【单选】下列 C++ 数据类型中,能够精确存储 10^18 + 1 这个整数的是( )。

答案:B

考点

基本数据类型数据表示变量与常量

解题思维

看各类型的"取值范围":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
Afloat4 字节,尾数 23 位,约 7 位有效十进制数字✗ 相差十亿倍以上
Blong long8 字节,约 ±9.2×10^18✓ 可以精确存储
Cdouble8 字节,尾数 52 位,仅能精确表示 ≤ 2^53 ≈ 9.0×10^15 的整数✗ 会丢精度
Dint4 字节,约 ±2.1×10^9✗ 直接溢出

10^18 + 1 = 1000000000000000001,需要约 60 个二进制位。long long 是 64 位有符号整数,上限 2^63−1 ≈ 9.22×10^18,完全放得下,因此选 B。

为什么 C 是最大的陷阱

double 看起来"能存很大很大的数"(它连 1e308 都能表示),但那是浮点语义:64 位里有 1 位符号、11 位指数、52 位尾数。尾数只有 52 位,意味着它只能精确表示 2^53 以内的整数;超过之后相邻两个可表示的 double 之间的间隔会大于 1,10^18 附近的间隔是 128,所以 10^18+1 会被"四舍五入"成邻近的偶数,根本区分不出来。

记忆点

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断