GESP 一级 第 04 讲:基本数据类型与取值范围

本讲定位:一级最容易被低估的一讲。官方大纲把整型、实数型、字符型、布尔型四类逐条列出,还点名了具体的类型名(intlong longfloatdoublecharbool)——这说明要考到类型名和取值范围的细节。更要命的是,数据类型选错是编程题失分的隐形杀手:算法完全正确、样例也过了,提交上去只得一半分,原因往往就是 int 存不下。

对应官方大纲:一级知识块 7「基本数据类型」——整数型:intlong long;实数型:floatdouble;字符型:char;布尔型:bool

前置知识:一级第 02 讲(输入输出)、第 03 讲(变量与常量)。

代码说明:本讲所有代码均已用 g++ 11.5(-std=c++11,64 位 Linux)编译运行验证,输出结果即为文中标注结果。字节数与取值范围在主流的 64 位 Windows/Linux + g++ 环境下一致,GESP 考场即按此标准。


1. 先看一道会让人吃大亏的题

输入两个整数 $a, b$($1 \le a, b \le 100000$),输出 $a \times b$。

学生几乎都会这么写:

#include<iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    cout << a * b << endl;
    return 0;
}

输入 100000 100000 时的实际输出:

1410065408

正确答案应该是 $10^{10} = 10000000000$。

样例里给的小数据全对,交上去却只得一部分测试点的分——这就是类型溢出。这一讲就是为了让你永远不再踩这个坑。


2. 为什么要有”类型”

变量是个盒子。类型决定了这个盒子有多大、能装什么形状的东西。

int a;        // 一个能装整数的中号盒子
double b;     // 一个能装小数的盒子
char c;       // 一个只能装一个字符的小盒子

盒子越大越费内存,所以不能一律用最大的;盒子太小又装不下。选类型 = 在”够用”和”省内存”之间做选择。

查看盒子有多大,用 sizeof(它是关键字,返回字节数):

#include<iostream>
using namespace std;

int main() {
    cout << sizeof(int) << endl;
    cout << sizeof(long long) << endl;
    cout << sizeof(float) << endl;
    cout << sizeof(double) << endl;
    cout << sizeof(char) << endl;
    cout << sizeof(bool) << endl;
    return 0;
}

输出:

4
8
4
8
1
1