C语言中long和int有何区别与选择?

99ANYc3cd6
预计阅读时长 14 分钟
位置: 首页 C语言 正文
特性 int long
目的 整数类型,作为系统的“默认”整数类型。 整数类型,通常保证比 int 有更大的范围。
大小 不固定,通常为 16 位或 32 位。 不固定,通常为 32 位或 64 位。
范围 -32,76832,767 (16位) 或 -2,147,483,6482,147,483,647 (32位) -2,147,483,6482,147,483,647 (32位) 或 -9,223,372,036,854,775,8089,223,372,036,854,775,807 (64位)
关键点 速度最快,优先使用。 范围更大,当 int 不够用时使用。
可移植性 ,其大小依赖于编译器和平台。 较好,现代系统上通常是 32 或 64 位。

int (Integer)

int 是 C 语言中最基本、最常用的整数类型。

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

大小和范围

int 的大小(占用的字节数)是不固定的,它取决于你所使用的编译器目标系统(操作系统和硬件架构)。

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

    • sizeof(int) 通常是 4 字节 (32 位)
    • 它的范围是 -2,147,483,6482,147,483,647(即 -2³¹2³¹ - 1)。
  • 在一些非常老的 16 位系统上(如早期的 MS-DOS):

    • sizeof(int) 可能是 2 字节 (16 位)
    • 它的范围是 -32,76832,767(即 -2¹⁵2¹⁵ - 1)。

何时使用 int

  1. 默认选择:当你需要一个整数变量,且没有特殊要求时,int 是你的首选,因为它是为当前系统优化的,通常运算速度最快。
  2. 循环计数器for 循环中的计数器几乎总是用 int
  3. 数组索引:数组的索引也几乎总是用 int

示例:

c语言 long 和 int
(图片来源网络,侵删)
#include <stdio.h>
int main() {
    int counter = 0;
    int sum = 0;
    for (counter = 0; counter < 100; ++counter) {
        sum += counter;
    }
    printf("Sum is: %d\n", sum); // %d 是 int 的格式化输出
    printf("Size of int is: %zu bytes\n", sizeof(int)); // 输出 4 (在64位系统上)
    return 0;
}

long (Long Integer)

long 是另一种整数类型,它的设计初衷是为了提供比 int 更大的数值范围。

大小和范围

int 一样,long 的大小也是不固定的,但它通常比 int 大。

  • 在 32 位系统上:

    • sizeof(long) 通常是 4 字节 (32 位),和 int 一样大。
    • 范围也是 -2,147,483,6482,147,483,647
  • 在 64 位系统上 (主流现状):

    c语言 long 和 int
    (图片来源网络,侵删)
    • sizeof(long) 通常是 8 字节 (64 位)
    • 范围是 -9,223,372,036,854,775,8089,223,372,036,854,775,807(即 -2⁶³2⁶³ - 1)。

何时使用 long

  1. 数值可能超出 int 范围时:如果你需要处理的数字可能超过 int 的最大值(计算文件大小、内存地址、大型数据库ID等),就应该使用 long
  2. 需要更大的范围时:明确知道你需要一个更大的数值范围。

示例:

#include <stdio.h>
int main() {
    long large_number = 123456789012L; // 注意 L 后缀,表示这是一个 long 常量
    printf("The large number is: %ld\n", large_number); // %ld 是 long 的格式化输出
    printf("Size of long is: %zu bytes\n", sizeof(long)); // 输出 8 (在64位系统上)
    return 0;
}

关键区别与选择指南

区别总结

区别点 int long
大小 平台相关 (通常是 32 位) 平台相关 (通常是 64 位)
范围 较小 较大
性能 通常最快 int 相同或略慢
可移植性 较差,大小不固定 较好,现代系统上大小趋同

如何选择?黄金法则

  1. 优先使用 int:除非有明确的理由不使用它,否则 int 是你的最佳选择,它是 C 语言的“自然”整数类型,性能最好。
  2. 如果数值可能超出 int 的范围,请使用 long:这是一个基于对数值范围的预判,如果你不确定,或者数值增长很快(比如累加操作),使用 long 更安全。
  3. 不要依赖 intlong 的大小:永远不要写这样的代码:
    // 错误示例!这在64位系统上会溢出
    int big_num = 2000000000;
    big_num = big_num * big_num; 

    也不要假设 long 一定比 int 大(虽然在现代系统上几乎总是这样)。


扩展:long long<stdint.h>

为了解决整数大小不固定带来的可移植性问题,C99 标准引入了两个重要的解决方案。

long long

long long 是一个保证比 long 更大的类型,在所有现代系统上,它都是 8 字节 (64 位)

  • 大小:至少 8 字节。
  • 范围:至少 -9,223,372,036,854,775,8089,223,372,036,854,775,807
  • 常量后缀LLll (9000000000000000000LL)。

当你需要绝对的 64 位整数时,应该使用 long long

<stdint.h> (可移植整数类型)

这是解决可移植性问题的最佳实践,这个头文件定义了一系列具有明确大小的整数类型,它们在任何符合标准的编译器上大小都一样。

  • int32_t: 一个正好 32 位的有符号整数。
  • int64_t: 一个正好 64 位的有符号整数。
  • uint32_t: 一个正好 32 位的无符号整数。
  • uint8_t: 一个正好 8 位的无符号整数 (也就是 char)。

示例:

#include <stdio.h>
#include <stdint.h> // 引入这个头文件
int main() {
    // 如果你需要一个精确的 32 位整数,而不是依赖平台的 "int"
    int32_t my_counter = 100;
    printf("32-bit counter: %d\n", my_counter);
    // 如果你需要一个精确的 64 位整数
    int64_t file_size = 15000000000LL;
    printf("File size: %lld\n", file_size);
    return 0;
}

总结与最佳实践

  1. int: 默认、最快、用于常规任务(循环、索引)。
  2. long: 用于可能超出 int 范围的大数,在现代 64 位系统上,它通常是 64 位的。
  3. long long: 当你明确需要 64 位整数时使用,保证跨平台一致性。
  4. <stdint.h>: 最佳实践,当你需要特定大小的整数(如 32 位、64 位)以确保代码的可移植性时,总是优先使用 int32_t, int64_t 等类型。
  5. 永远不要假设大小:不要写 if (sizeof(long) > sizeof(int)) 这样的代码,如果需要,使用 <stdint.h> 中的类型。
-- 展开阅读全文 --
头像
织梦文章分页代码CSS如何实现样式调整?
« 上一篇 02-10
Linux C文件操作如何高效读写与错误处理?
下一篇 » 02-10

相关文章

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

目录[+]