CC++ & Algorithm

基本数据类型(int、long long)

简单6
语言版本:C++
概述:了解整数在C++中的两种常见“包装箱”大小:普通整数和超长整数。

数字的“容器”有多大?——C++ 里的 int 与 long long

在写程序时,我们经常需要存一些整数——比如你的年龄、考试分数、零花钱数、全班同学人数,甚至全中国的人口。不同的整数大小不同,C++ 为我们准备了不同大小的“容器”来装它们。最常用的两种是 int(普通整数)和 long long(超长整数)。好比一个文具盒,int 是普通大小的铅笔盒,long long 是一个加长版的大箱子。学会选择合适的容器,能让你的程序既省内存又不会出错。

一、int:日常够用的“标准盒”

int 是 C++ 中最常用的整数类型。它占 4 个字节(32 位),能装下的整数范围大约是 -21亿 到 21亿,精确地说就是 -21474836482147483647。如果你要表示的数字在这个范围内,用 int 就足够了。

生活例子

  • 你的年龄:14 → 用 int 没问题。
  • 全班人数:45 → 没问题。
  • 一年有多少秒:60×60×24×365 ≈ 3153万 → 也没问题。
int score = 95;        // 考试分数:-2^31 ~ 2^31-1,够用
int count = 1000;      // 盒子里有多少颗糖果
int seconds = 31536000; // 一年秒数,在范围内
int max_int = 2147483647; // int 能放的最大值

注意int 默认是有符号的,可以表示正数和负数。如果只存正数(比如人数、次数),也可以考虑用 unsigned int,它能把范围撑到 0~42亿左右(后面会提到)。

二、当数字太大时:long long 登场

有时候你会遇到超级大的数,比如:

  • 全球人口约 80亿(8,000,000,000)
  • 银河系恒星数量约 1000亿(100,000,000,000)
  • 10的12次方(1,000,000,000,000)

这些数字都超过了 int 的范围(21亿)。如果用 int 去装,就会发生“溢出”——好比往一个只能装 21亿的小盒子硬塞进 80亿,结果数字会翻跟头变成负数,计算结果完全错误。

// 错误示例:int 装不下大数
int population = 8000000000;  // 80亿 > 21亿,会溢出!
cout << population;           // 可能输出一个莫名其妙的负数

这时候需要用加长版盒子 long long。它占 8 个字节(64 位),能装下的范围大约是 -9百亿亿 到 9百亿亿(-9223372036854775808 ~ 9223372036854775807),这几乎能处理日常生活中遇到的所有整数了。

long long population = 7800000000;          // 78亿,安全
long long bigNumber = 123456789012345LL;    // 末尾加 LL 表示这个数是 long long 类型
long long stars = 100000000000;             // 1000亿颗恒星

小提示:在数值后面加上 LL(或小写 ll)是为了告诉编译器“这个数字我要当作 long long 来存”,但大多数情况下编译器会自动识别,加不加都行。不过为了清晰,建议在超出 int 范围的数字后都加上 LL

三、为什么要有两种?——内存与速度的权衡

你可能想问:既然 long long 能装更大的数,为什么还要用 int
原因很简单:省内存,运行快

  • int 占 4 字节,long long 占 8 字节。
  • 如果定义一个大数组,比如有 100 万个元素,用 int 需要约 4MB 内存,用 long long 需要 8MB。在比赛或性能敏感的程序中,内存是宝贵的。
  • 另外,CPU 处理 32 位整数一般比处理 64 位整数快一点点(在部分老式电脑上明显,现代电脑差别不大)。

所以,能用 int 时尽量用 int,只有当你确定数字可能会超过 21亿(或小于 -21亿),才用 long long。不过如果你是初学者,写简单代码时,保险起见可以直接用 long long,避免溢出带来的麻烦。

四、溢出——数字的“翻跟头”现象

刚才提到 int 溢出会变成负数,下面我们亲眼看看:

#include <iostream>
using namespace std;

int main() {
    int a = 2147483647;  // int 能表示的最大值
    cout << "a = " << a << endl;
    a = a + 1;           // 溢出!变成最小值
    cout << "a + 1 = " << a << endl;  // 输出 -2147483648
    return 0;
}

输出:

a = 2147483647
a + 1 = -2147483648

为什么 最大值+1 会变成最小值?因为计算机用二进制表示数字,当加法导致进位超出 32 位时,最高位丢失,结果从负数的一端重新开始。这就像汽车的里程表,从 99999 公里再跑 1 公里又变回 00000 公里。在考试中,如果发生溢出,你的程序可能输出错误答案,判分系统会给你 0 分。

用 long long 就不会有这个问题(只要你不超过它的范围):

long long b = 2147483647;  // 这个数在 long long 里很小
b = b + 1;
cout << "b + 1 = " << b << endl; // 正确输出 2147483648

五、新手容易犯的 3 个错误

错误1:用 int 存大数,导致溢出

int money = 5000000000;   // 50亿,超出 int!编译器可能会警告或自动转成错误值

解决方法:使用 long long money = 5000000000LL;

错误2:忘记加 LL 后缀,导致计算时被当作 int

long long x = 100000 * 100000;  // 100000 是 int,相乘结果也是 int,溢出后才赋给 x
// 实际上 100000*100000 = 10^10,超出 int,结果错误
cout << x;  // 输出错误值

解决方法:至少一个操作数用 long long,比如 100000LL * 100000

错误3:定义变量但没赋初始值,使用时得到随机值

int age;           // 只定义,没赋值
cout << age;       // 输出什么?可能是任意值(旧内存内容)

解决方法:定义时立刻初始化,如 int age = 0;

六、完整示例:计算全班零花钱总数

假设班里 45 个同学,每人有若干元零花钱,可能达到万级别(比如每人 100 元),总数不到 5000;但如果每人有几十万(比如 30 万),总数就会超过 int 范围(45×30万 = 1350万,还在 int 内),但若每人有 1 亿呢?45亿就超了。所以保险起见用 long long。

#include <iostream>
using namespace std;

int main() {
    long long money_per_person = 100000000;  // 每人1亿元(假设)
    int student_count = 45;                  // 全班45人
    long long total_money = money_per_person * student_count;  // 乘积用 long long
    cout << "全班总零花钱 = " << total_money << " 元" << endl;  // 正确输出 45亿
    return 0;
}

输出:

全班总零花钱 = 4500000000 元

如果改用 int 存储 money_per_person,程序就会输出错误结果。试试看?

七、相关指引

  • 无符号整数unsigned intunsigned long long 只能存非负数,正数范围翻倍。例如 unsigned int 范围 0~4294967295。但要注意,用它们做减法可能产生意外(如 0-1 变成大正数)。
  • 浮点数:如果数字有小数,比如 3.14,需要用 floatdouble
  • 类型转换intlong long 可以互相赋值,但大转小时会截断或溢出。
  • 极限值查询:在 <climits> 头文件中定义了 INT_MAXLLONG_MAX 等常量,可以用它们查看范围。

推荐学习顺序:先掌握 intlong long,再了解 unsigned,然后接触浮点数 double,最后学习类型转换的规则。

小结

  • 整数储存在不同大小的“容器”里:int(约±21亿)和 long long(约±9百亿亿)。
  • 小数字用 int,大数字用 long long(或者不确定时直接用 long long)。
  • 溢出是常见错误,学会通过选择合适类型来避免。
  • 定义变量时一定要赋初始值。

记住:选对容器,程序不崩!

例题精讲

1单选题

在大多数C++编译环境中,int类型的变量能存储的最大整数大约是多少?

A2147483647
B32767
C9223372036854775807
D4294967295
2判断题

在C++中,long long类型可以存储比int类型更大的整数。

3填空题
以下代码试图计算两个大整数的乘积,但可能溢出。请填空使代码能正确处理大数乘法:

int a = 100000, b = 100000;
long long product = ___;
cout << product;
4单选题

已知 int x = 2147483647; 则执行 x = x + 1; 后,x的值最可能是什么?

A2147483648
B-2147483648
C0
D2147483647
5填空题
以下代码尝试输出一个很大的整数,但编译时可能产生警告。请填空使代码正确且无警告:

___ x = 1234567890123;
cout << x;