C语言中long long int的范围是多少?

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

核心概念:它是什么?

long long int(通常简写为 long long)是 C 语言中一种有符号整数类型

c语言中long long int
(图片来源网络,侵删)
  • long long: 表示它的范围“很长很长”。
  • int: 表明它本质上是一个整数类型。
  • 有符号: 意味着它可以表示正数、负数和零。

大小和范围

long long int 的关键特性是其能够存储的数值范围。

  • 大小: 在现代的 32 位和 64 位系统上(如 Windows, Linux, macOS),long long int 通常占用 64 位(8 字节)的内存空间。
  • 范围: 由于是有符号类型,64 位中最高位(第 63 位)用作符号位(0 表示正,1 表示负)。
    • 最大值: 2⁶³ - 1,即 9,223,372,036,854,775,807
    • 最小值: -2⁶³,即 -9,223,372,036,854,775,808

如何确认? 你可以使用 <limits.h> 头文件中定义的宏来获取你系统上 long long 的确切范围:

#include <stdio.h>
#include <limits.h>
int main() {
    printf("Size of long long int: %zu bytes\n", sizeof(long long int));
    printf("Minimum value of long long int: %lld\n", LLONG_MIN);
    printf("Maximum value of long long int: %lld\n", LLONG_MAX);
    return 0;
}

输出示例(在 64 位系统上):

Size of long long int: 8 bytes
Minimum value of long long int: -9223372036854775808
Maximum value of long long int: 9223372036854775807

注意

c语言中long long int
(图片来源网络,侵删)
  • sizeof(long long int) 返回的是 size_t 类型,所以使用 %zu 格式化。
  • LLONG_MINLLONG_MAXlong long 类型的最小/最大值常量。
  • 同样还有 ULLONG_MAX 用于表示 unsigned long long 的最大值。

为什么需要 long long int

C 语言提供了多种整数类型(int, short, long, long long),它们的尺寸取决于具体的编译器和操作系统。long long 的引入主要是为了解决一个问题:

long 类型不够用时怎么办?

在 64 位系统出现之前,许多系统上的 long 也是 32 位的(范围约 ±21亿),如果需要进行大数计算,比如计算文件总大小(TB 级别)、天文数字、或者 64 位时间戳,32 位的 intlong 就会溢出。

经典案例:时间戳

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

在 Unix 和类 Unix 系统中,时间戳(自 1970 年 1 月 1 日以来的秒数)最初用 time_t 类型表示,在 32 位系统上,time_t 通常就是 intlong,这意味着它将在 2038 年 1 月 19 日达到其最大值,导致“2038年问题”(Y2038 problem)。

为了解决这个问题,现代系统(特别是 64 位系统)将 time_t 定义为 long longlong,使其能够安全地表示到公元 292,277,026,596 年。

long longlong 的区别

这是一个常见且重要的问题。

特性 long long int long int
C标准引入 C99 C89 (ANSI C)
保证最小尺寸 64 位 (8 字节) 32 位 (4 字节)
典型系统尺寸 64 位 (8 字节) 32 位 (4 字节) 或 64 位 (8 字节)
可移植性 ,在所有符合 C99 及以上标准的编译器上,尺寸和范围都是确定的。 较低,尺寸依赖于平台,在 Windows (x86) 上是 4 字节,在 Linux/macOS (x86-64) 上是 8 字节。
  • 如果你需要一个固定的大整数范围,并且你的代码需要高度可移植,请使用 long long
  • 如果你只是需要比 int 大的数,并且不关心平台差异,可以使用 long
  • 在现代 64 位系统上,longlong long 通常是相同的尺寸,但 long long 的语义更明确。

使用示例

基本赋值和打印

#include <stdio.h>
int main() {
    long long big_num = 123456789012345LL; // 注意 LL 后缀
    long long neg_big_num = -987654321098765LL;
    printf("The big positive number is: %lld\n", big_num);
    printf("The big negative number is: %lld\n", neg_big_num);
    return 0;
}

关键点:在给 long long 类型的变量赋值时,如果字面量很大,最好在末尾加上 LLll 后缀,这告诉编译器这是一个 long long 常量,避免潜在的截断。

计算大数阶乘

#include <stdio.h>
int main() {
    long long factorial = 1;
    int n = 20; // 20! 已经远超 int 的范围
    for (int i = 1; i <= n; ++i) {
        factorial *= i;
    }
    printf("%d! = %lld\n", n, factorial);
    return 0;
}

输出:

20! = 2432902008176640000

如果这里使用 int 类型,结果会溢出,得到一个完全错误的负数。

unsigned long long int

long long int 对应的是无符号版本 unsigned long long int(或 unsigned long long)。

  • 大小: 同样是 64 位。
  • 范围: 02⁶⁴ - 1(即 18,446,744,073,709,551,615)。
  • 用途: 当你确定数值不会是负数,并且需要表示更大的正数时使用。
#include <stdio.h>
#include <limits.h>
int main() {
    unsigned long long max_ull = ULLONG_MAX;
    printf("Maximum value of unsigned long long: %llu\n", max_ull);
    return 0;
}
特性 描述
类型 有符号 64 位整数
标准 C99 及以后
大小 通常是 8 字节
范围 -9,223,372,036,854,775,8089,223,372,036,854,775,807
优点 范围巨大,可移植性好,是处理大整数和 64 位时间戳的标准选择
格式化符 printf / scanf 使用 %lld
字面量后缀 LLll

在 C 语言中,当你需要处理可能超出 int 甚至 long 范围的整数时,long long int 是你的首选,它提供了一个强大、标准且可移植的解决方案。

-- 展开阅读全文 --
头像
dede首页如何调用图片集自定义字段?
« 上一篇 今天
switch中break为何必不可少?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

目录[+]