2. 基本数据类型
在C++中,数据类型是至关重要的概念。它告诉编译器如何解释存储在内存中的数据,以及可以对这些数据执行哪些操作。基本数据类型是构建更复杂数据结构(如数组、结构体)的基石。
[1] 整数型: int、long long
1、概念介绍
整数型(Integer Types)是用于存储没有小数部分的数字,即整数。在信息学竞赛中,最常用的两种整数类型是 int 和 long long。
int: 这是最常用的整数类型。它通常在内存中占用4个字节(32位),可以表示的范围大约是 -21亿 到 +21亿。对于大多数常规问题,int已经足够。long long: 当需要的数值范围超过int时,我们使用long long。它通常占用8个字节(64位),可以表示的范围大约是 -9x10¹⁸ 到 +9x10¹⁸,这是一个非常大的范围,足以应对绝大多数竞赛题目的数据。
2、使用步骤
使用整数类型变量通常遵循以下三步:
-
声明 (Declaration) : 告诉编译器我们要创建一个什么类型的变量,并给它一个名字。
int score; long long population; -
初始化 (Initialization) : 在声明变量的同时或之后,给它赋一个初始值。
int score = 100; long long population; population = 8000000000; -
使用 (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 a = 2000000000; int b = 2; // 错误: a*b会先以int类型计算,导致溢出,然后再赋值给c long long c = a * b; // 正确: 将其中一个操作数强制转换为long long long long d = 1LL * 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++ 语言基础 - 专为信息学竞赛编写的维基。