long long int范围是多少?如何正确使用?

99ANYc3cd6
预计阅读时长 16 分钟
位置: 首页 C语言 正文

long long int 是什么?

long long int 是 C 语言中的一种基本整数类型,它的核心特点是范围非常大,能够存储比普通的 intlong 类型大得多的整数值。

c语言 long long int
(图片来源网络,侵删)

为了方便,我们通常可以简写为 long long,编译器会自动理解 long longlong long int 是同一种类型。

// 这两种声明方式是等价的
long long int my_number;
long long my_number;

为什么需要 long long int

想象一下,你需要存储一个人的银行账户余额,或者计算一个国家的国民生产总值,这些数字可能非常大,远远超过了普通 int 类型的表示范围。

  • 一个 int 类型通常是 32 位,最大只能表示约 21 亿。
  • 如果一个公司的年收入超过 21 亿,用 int 存储就会发生溢出,导致计算结果错误。

long long int 就是为了解决这个问题而设计的,它提供了足够大的范围来处理现实世界中的大整数。

关键特性:大小和范围

long long int 的特性由 C 标准规定,但具体实现(即它占多少字节)可能因编译器和操作系统(32位 vs 64位)而异,在现代系统上,它通常是标准化的。

c语言 long long int
(图片来源网络,侵删)

标准规定

  • C99 标准:首次将 long long 引入标准,规定 long long最小范围-2⁶³ 到 2⁶³ - 1
  • C11 标准:沿用了 C99 的规定。

现代常见实现 (64位系统)

在绝大多数现代 64 位编译器和操作系统上(如 Linux, macOS, Windows 64位):

  • 大小long long int 通常占用 8 字节(64 位)。
  • 有符号范围-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
    • 用十六进制表示为:0x80000000000000000x7FFFFFFFFFFFFFFF
    • 用科学计数法表示约为:-9.2 x 10¹⁸ 到 9.2 x 10¹⁸。
  • 无符号范围:如果使用 unsigned long long,范围是 0 到 18,446,744,073,709,551,615 (即 2⁶⁴ - 1)。

与其他整数类型的比较

类型 常见大小 (字节) 常见有符号范围 常见无符号范围
char 1 -128 到 127 0 到 255
short 2 -32,768 到 32,767 0 到 65,535
int 4 -2,147,483,648 到 2,147,483,647 0 到 4,294,967,295
long 4 或 8 int 或同 long long unsigned int 或同 unsigned long long
long long 8 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 0 到 18,446,744,073,709,551,615

注意long 的大小在不同系统上可能不同(在 64 位 Linux/macOS 上是 8 字节,但在 64 位 Windows 上仍然是 4 字节),而 long long 在现代系统上则稳定得多。

如何使用 long long int

a) 声明变量

long long distance_to_star; // 有符号
unsigned long long file_size; // 无符号

b) 初始化变量

long long population = 7800000000LL; // 注意 LL 后缀
unsigned long long bytes_in_terabyte = 1099511627776ULL; // 注意 ULL 后缀

c) 字面量后缀

当你给 long longunsigned long long 类型的变量赋一个整数值时,强烈建议使用后缀,以确保编译器正确理解这个数字的类型。

  • LLll:表示 long long 类型。
  • ULLull:表示 unsigned long long 类型。

为什么需要后缀? 如果不加后缀,像 7800000000 这样的字面量,编译器可能会先尝试将其当作一个 intlong 来处理,如果这个数字超出了 intlong 的范围,就会发生编译警告或错误

c语言 long long int
(图片来源网络,侵删)
// 错误或警告的写法 (在32位系统上)
// long long x = 2147483648; // 2147483648 超出了 int 的最大值 2147483647
// 正确的写法
long long x = 2147483648LL; // 编译器知道这是一个 long long 字面量

虽然现代 64 位编译器可能对 long long 更宽容,但养成使用后缀的好习惯可以避免很多潜在的跨平台问题。

d) 格式化输出 (printf)

要使用 printf 打印 long long 类型的变量,必须使用正确的格式说明符,否则会导致输出错误。

  • %lld:用于打印有符号的 long long
  • %llu:用于打印无符号的 unsigned long long

示例代码:

#include <stdio.h>
int main() {
    // 1. 声明和初始化
    long long big_number = 123456789012345LL;
    unsigned long long very_big_number = 18446744073709551615ULL;
    // 2. 打印
    // 注意:必须使用 %lld 和 %llu
    printf("这是一个有符号的 long long: %lld\n", big_number);
    printf("这是一个无符号的 unsigned long long: %llu\n", very_big_number);
    // 3. 打印其范围边界
    printf("long long 的最大值: %lld\n", 9223372036854775807LL);
    printf("long long 的最小值: %lld\n", -9223372036854775808LL);
    return 0;
}

输出:

这是一个有符号的 long long: 123456789012345
这是一个无符号的 unsigned long long: 18446744073709551615
long long 的最大值: 9223372036854775807
long long 的最小值: -9223372036854775808

重要注意事项

a) 溢出

即使 long long 的范围很大,它仍然不是无限的,如果你对它进行计算,结果超出了其表示范围,就会发生整数溢出

  • 对于有符号数,溢出是未定义行为,可能导致程序崩溃或产生一个完全错误的值。
  • 对于无符号数,溢出是定义好的:它会“环绕”。ULLONG_MAX + 1 的结果会是 0

示例:

unsigned long long ull_max = 18446744073709551615ULL;
ull_max++; // 溢出,结果会变成 0
printf("溢出后的结果: %llu\n", ull_max); // 输出: 0

b) 算术运算

long long 可以参与所有标准的算术运算:, , , , ,只要参与运算的数都是 long long 类型,结果也会是 long long 类型。

long long a = 10000000000LL;
long long b = 100LL;
long long c = a * b; // c 的值是 1000000000000

c) 与其他类型的混合运算

long long 与较小的类型(如 int, char)混合运算时,较小的类型会被提升long long 类型,然后再进行计算,这通常能避免中间结果的溢出。

int small_num = 100;
long long big_num = 10000000000LL;
long long result = big_num * small_num; // small_num 会被临时提升为 long long
特性 描述
用途 存储非常大的整数,处理高精度计算。
大小 现代系统上通常是 8 字节 (64 位)
范围 有符号:约 -9.2 x 10¹� 到 9.2 x 10¹⁸。
无符号:约 0 到 1.8 x 10¹⁹。
字面量后缀 LLll (有符号),ULLull (无符号)。强烈推荐使用
printf 格式 %lld (有符号),%llu (无符号)。必须使用
核心优势 提供了远超 intlong 的数值范围,是现代 C 编程中处理大数事实上的标准。

掌握 long long int 是 C 语言编程中的一个重要里程碑,尤其是在算法、科学计算、金融或任何需要处理大数字的领域。

-- 展开阅读全文 --
头像
dede后台wap模板目录如何设置?
« 上一篇 前天
dede会员注册成功如何自动发送邮件提醒?
下一篇 » 前天
取消
微信二维码
支付宝二维码

目录[+]