C语言long int与int有何区别?

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

这是一个非常基础且重要的概念,涉及到 C 语言中整数的表示范围和内存占用。

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

long int 是什么?

long int 是 C 语言中的一种基本数据类型,用于表示整数,它的关键字是 longint,它们可以组合使用,但通常我们直接使用 long 即可,因为编译器会默认将其解释为 long int

// 以下三种声明方式在功能上是等价的
long int my_long_num;
long another_long_num;
long long_num; // 这是最常见的写法

long int 的核心特性:大小和范围

long int 最关键的两个特性是它占用的内存大小和它能表示的数值范围。

内存大小

在 C 语言中,一个数据类型的大小(以字节为单位)是由实现决定的,也就是说,它依赖于你使用的编译器目标操作系统/架构

  • 在大多数现代 64 位系统(如 Linux, macOS, Windows 64位)上:

    c语言 longint
    (图片来源网络,侵删)
    • sizeof(long int) 的结果是 4 字节(32位)。
    • 这和 int 的大小通常是相同的。
  • 在一些古老的 32 位系统或特定的嵌入式系统上:

    • sizeof(long int) 的结果可能是 4 字节(32位)。
    • 但在某些情况下,为了提供更大的范围,它也可能是 8 字节(64位)。

关键点: 永远不要假设 long int 的大小,要确切知道它在你的环境中的大小,请使用 sizeof 运算符。

#include <stdio.h>
int main() {
    printf("Size of long int on this system: %zu bytes\n", sizeof(long int));
    return 0;
}

运行这段代码,你就能看到在你的环境中 long int 到底占多少字节。

数值范围

内存大小直接决定了数值范围,范围分为两种:有符号(可以表示正数、负数和零)和无符号(只能表示非负数)。

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

默认情况下,long int有符号的。

  • long int 是 4 字节(32位)时:

    • 有符号 (long int): 范围是 -2,147,483,6482,147,483,647 (即 -2³¹ 到 2³¹ - 1)。
    • 无符号 (unsigned long int): 范围是 04,294,967,295 (即 0 到 2³² - 1)。
  • long int 是 8 字节(64位)时:

    • 有符号 (long int): 范围是 -9,223,372,036,854,775,8089,223,372,036,854,775,807 (即 -2⁶³ 到 2⁶³ - 1)。
    • 无符号 (unsigned long int): 范围是 018,446,744,073,709,551,615 (即 0 到 2⁶⁴ - 1)。

long int 与其他整数类型的比较

为了更好地理解 long int 的位置,我们来看一下它与 intlong long 的关系。

类型 常见大小 (字节) 常见范围 (有符号) 备注
char 1 -128 到 127 字符类型,本质上是小整数
short 2 -32,768 到 32,767 短整型,保证不小于 char
int 4 -2,147,483,648 到 2,147,483,647 整型,大小由实现决定,但通常是机器的自然字长
long / long int 4 或 8 取决于大小 长整型,保证不小于 int
long long / long long int 8 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 长长整型,C99标准引入,保证不小于 long

重要规则(由 C 标准保证):

  1. sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
  2. sizeof(signed type) == sizeof(unsigned type)sizeof(int)sizeof(unsigned int) 是一样的)

如何选择使用哪种整数类型?

这是一个非常好的编程习惯问题。

场景 推荐类型 理由
常规计数、循环变量、数组索引 int int 是 C 语言中最自然、最高效的整数类型,除非有特殊需求,否则默认使用它。
需要非常大的整数(超过 long 的范围) long long long long 提供了 64 位的范围,足以满足绝大多数大数需求。
需要非常大的非负整数(超过 unsigned long 的范围) unsigned long long unsigned long long 的范围是 0 到 2⁶⁴ - 1,非常大。
需要确定大小的整数(跨平台开发) <stdint.h> 中的类型 这是最佳实践! <stdint.h> 头文件定义了精确大小的整数类型,如 int32_t (正好32位), uint64_t (正好64位无符号) 等。
内存极其紧张(如嵌入式系统) shortint 如果数值范围允许,使用更小的类型可以节省内存。

代码示例

#include <stdio.h>
#include <limits.h> // 包含各种整数类型的限制信息
int main() {
    // 声明一个 long int 变量
    long int a = 2147483647; // 32位 long int 的最大值
    long int b = -2147483648; // 32位 long int 的最小值
    // 打印大小和范围
    printf("Size of long int: %zu bytes\n", sizeof(long int));
    printf("Size of int: %zu bytes\n", sizeof(int));
    // 使用 <limits.h> 中的宏来获取精确范围
    printf("Maximum value of a long int: %ld\n", LONG_MAX);
    printf("Minimum value of a long int: %ld\n", LONG_MIN);
    // 打印变量的值
    printf("Value of a: %ld\n", a);
    printf("Value of b: %ld\n", b);
    // 演示溢出
    a = a + 1; // 超过了 LONG_MAX
    printf("Value of a after overflow: %ld (This is undefined behavior!)\n", a);
    return 0;
}
  1. long int 是 C 语言中的长整型,用于表示可能超出 int 范围的整数。
  2. 大小不固定:在 64 位系统上通常是 4 字节,在 32 位系统上可能是 4 或 8 字节。务必用 sizeof() 检查
  3. 有符号和无符号:默认为有符号,可以使用 unsigned long int 来表示非负数,范围会翻倍。
  4. 选择类型要谨慎
    • 默认用 int
    • 需要更大范围用 long long
    • 追求跨平台、确定大小,请使用 <stdint.h> 中的类型(如 int32_t,这是现代 C 编程的推荐做法。
-- 展开阅读全文 --
头像
织梦文章列表缩略图如何设置?
« 上一篇 今天
织梦文章id怎么看?如何快速找到?
下一篇 » 今天

相关文章

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

目录[+]