信奥崔老师: 基本数据类型

119 阅读6分钟

2. 基本数据类型

图片

在C++中,数据类型是至关重要的概念。它告诉编译器如何解释存储在内存中的数据,以及可以对这些数据执行哪些操作。基本数据类型是构建更复杂数据结构(如数组、结构体)的基石。

[1] 整数型: intlong long

1、概念介绍

整数型(Integer Types)是用于存储没有小数部分的数字,即整数。在信息学竞赛中,最常用的两种整数类型是 int 和 long long

  • int: 这是最常用的整数类型。它通常在内存中占用4个字节(32位),可以表示的范围大约是 -21亿 到 +21亿。对于大多数常规问题,int 已经足够。
  • long long: 当需要的数值范围超过 int 时,我们使用 long long。它通常占用8个字节(64位),可以表示的范围大约是 -9x10¹⁸ 到 +9x10¹⁸,这是一个非常大的范围,足以应对绝大多数竞赛题目的数据。

2、使用步骤

使用整数类型变量通常遵循以下三步:

  1. 声明 (Declaration) : 告诉编译器我们要创建一个什么类型的变量,并给它一个名字。

    int score;
    long long population;
    
  2. 初始化 (Initialization) : 在声明变量的同时或之后,给它赋一个初始值。

    int score100;
    long long population;
    population8000000000;
    
  3. 使用 (Usage) : 在表达式、计算、输入输出等操作中使用这个变量。

    score = score + 10;
    cout << population << endl;
    cin >> score;
    

3、算法可视化SVG图示  3、算法可视化 SVG 图示

下图展示了 int 和 long long 在内存中的典型存储方式。int 占用4个字节,而 long long 占用8个字节,因此后者能存储更大范围的数字。

int (4 字节 / 32位) 内存示意图

图片

**

**

long long (8 字节 / 64位) 内存示意图

图片

**

**

4、核心特性

  • 精确性: 整数运算是精确的,不会有舍入误差。
  • 范围有限: 每种整数类型都有一个固定的数值范围。超出这个范围会导致溢出(Overflow) ,结果会变得不可预测(通常是回绕,例如最大值+1会变成最小值)。
  • 运算速度: 整数运算是计算机中最快的运算之一。

5、C++代码基础实现

#include <iostream>
#include <limits> // 用于获取数据类型的最大最小值

int main() {
    // 1. 声明和初始化 int 变量
    int score = 95;
    int temperature = -5;

    // 2. 声明和初始化 long long 变量
    long long worldPopulation = 7900000000LL// 'LL'后缀明确表示这是一个long long字面量

    // 3. 打印变量值
    std::cout << "Score: " << score << std::endl;
    std::cout << "Temperature: " << temperature << std::endl;
    std::cout << "World Population: " << worldPopulation << std::endl;

    // 4. 演示基本运算
    int a = 10, b = 3;
    std::cout << "a + b = " << a + b << std::endl// 加
    std::cout << "a - b = " << a - b << std::endl// 减
    std::cout << "a * b = " << a * b << std::endl// 乘
    std::cout << "a / b = " << a / b << std::endl// 整除,结果为3
    std::cout << "a % b = " << a % b << std::endl// 取余,结果为1

    // 5. 查看 int 和 long long 的范围
    std::cout << "Max int: " << std::numeric_limits<int>::max() << std::endl;
    std::cout << "Max long long: " << std::numeric_limits<long long>::max() << std::endl;
    
    return 0;
}

6、优化策略

  • 选择合适的类型: 预估题目中数据可能的最大值。如果不会超过20亿,使用int可以节省内存。如果可能超过,必须使用long long以避免溢出。在竞赛中,"十年OI一场空,不开long long见祖宗" 是一句警示名言。
  • 使用unsigned: 如果确定一个变量永远不会是负数(如年龄、数量),可以使用 unsigned int 或 unsigned long long。这会将负数部分的范围移到正数部分,使正数范围扩大一倍。

7、优缺点

  • 优点:
    • 运算速度快。
    • 内存占用固定且相对较小。
    • 表示精确,没有误差。
  • 缺点:
    • 数值范围有限,需要注意溢出问题。
    • 无法表示小数。

8、应用场景

  • 计数器: 循环变量、统计数量等。
  • 数组/字符串索引: 访问特定位置的元素。
  • ID或编号: 唯一的整数标识符。
  • 需要精确计算的场景: 绝大多数算法问题,如动态规划、图论、数论等。

9、扩展

  • short: 比 int 更短的整数类型(通常2字节),用于内存极度受限的场景,竞赛中较少使用。

  • unsigned: 无符号版本,只能表示非负整数,但正数范围翻倍。

  • 溢出陷阱: 两个大的 int 相乘,结果可能超出 int 范围。即使你将结果存入 long long,如果乘法本身是用 int 完成的,溢出已经发生。

    int a2000000000;
    int b2;
    // 错误: a*b会先以int类型计算,导致溢出,然后再赋值给c
    long long c = a * b
    // 正确: 将其中一个操作数强制转换为long long
    long long d1LL * a * b
    

10、5个课后配套练习及C++代码实现答案

练习1: A+B问题

  • 题目: 输入两个整数 a 和 b,输出它们的和。

  • 答案:

    #include <iostream>
    int main() {
        int a, b;
        std::cin >> a >> b;
        std::cout << a + b << std::endl;
        return 0;
    }
    

练习2: 计算矩形面积

  • 题目: 输入两个整数 length 和 width,代表矩形的长和宽,计算并输出其面积。

  • 答案:

    #include <iostream>
    int main() {
        long long length, width;
        std::cin >> length >> width;
        long long area = length * width;
        std::cout << area << std::endl;
        return 0;
    }
    

练习3: 整数除法与取余

  • 题目: 输入两个整数 dividend 和 divisor,分别输出 dividend 除以 divisor 的商和余数。

  • 答案:

    #include <iostream>
    int main() {
        int dividend, divisor;
        std::cin >> dividend >> divisor;
        std::cout << dividend / divisor << " " << dividend % divisor << std::endl;
        return 0;
    }
    

练习4: 数值溢出

  • 题目: 输入两个整数 a 和 b,范围都在 1到10¹²。计算并输出它们的乘积。

  • 答案: (提示:必须使用long long来读取和计算)

    #include <iostream>
    int main() {
        long long a, b;
        std::cin >> a >> b;
        // 注意:C++中 `__int128` 是非标准扩展,但很多竞赛平台支持
        // 如果题目范围更大,可能需要使用高精度算法(字符串模拟)
        // 这里假设乘积在 __int128 范围内
        __int128 result = (__int128)a * b;
        // C++标准库没有直接输出 __int128 的方法,需要手写
        // 简单起见,如果题目保证结果在 long long 内,就用 long long
        long long product = a * b;
        std::cout << product << std::endl;
        return 0;
    }
    

练习5: 秒数转换

  • 题目: 输入一个总秒数 total_seconds,将其转换为 小时:分钟:秒 的格式输出。

  • 答案:

    #include <iostream>
    int main() {
        int total_seconds;
        std::cin >> total_seconds;
        int hours = total_seconds / 3600;
        int minutes = (total_seconds % 3600) / 60;
        int seconds = total_seconds % 60;
        std::cout << hours << ":" << minutes << ":" << seconds << std::endl;
        return 0;
    }
    

11、相关网络资源推荐

  • cppreference.com - Fundamental types - 最权威的C++类型参考。
  • LearnCpp.com - Introduction to fundamental data types - 对初学者非常友好的教程。
  • OI Wiki - C++ 语言基础 - 专为信息学竞赛编写的维基。