C++当中long int vs long long int & long double vs double

C++当中long int vs long long int & long double vs double

内容

在 C/C++ 中,doublelong doublelong intlong long 的区别主要在于 精度、存储大小和用途。以下是详细对比:


一、浮点类型:double vs long double

特性 double (双精度) long double (扩展双精度)
存储大小 通常 8 字节 (64 位) 通常 10~16 字节 (如 80 位或 128 位)
有效十进制精度 15~17 位 18~34 位
标准要求 必须支持,精度 >= float 由编译器实现决定,精度 >= double
典型用途 通用高精度计算 科学计算、金融等需要超高精度的场景
性能 较快 较慢(依赖硬件支持)
字面值后缀 0.0(默认 double 0.0L0.0l

示例代码

double a = 3.141592653589793;     // 双精度
long double b = 3.1415926535897932385L; // 扩展双精度

注意事项

  • 跨平台差异
    例如,在 x86 架构中,long double 通常是 80 位扩展双精度(实际存储为 12 或 16 字节),而在 ARM 或某些编译器中可能等同于 double
  • 精度陷阱
    long double 的精度和范围依赖硬件支持,需检查编译器的文档(如 sizeof(long double))。

二、整数类型:long int vs long long int

特性 long int (长整型) long long int (长长整型)
存储大小 至少 4 字节 (32 位) 至少 8 字节 (64 位)
最小值范围 -2³¹ ~ 2³¹-1 -2⁶³ ~ 2⁶³-1
典型用途 兼容旧代码、32 位系统 处理超大数据(如时间戳、哈希值)
字面值后缀 L(如 123456789L LL(如 123456789012345LL
跨平台一致性 不统一(见下表) 统一为 64 位

不同系统的存储差异

系统/编译器 long int 大小 long long int 大小
Windows (x64) 4 字节 (32 位) 8 字节 (64 位)
Linux/macOS (x64) 8 字节 (64 位) 8 字节 (64 位)

示例代码

long int li = 2147483647L;          // 32 位或 64 位,依平台而定
long long int lli = 9223372036854775807LL; // 固定 64 位

注意事项

  • 可移植性问题
    long int 的大小在 Windows 和 Linux/macOS 中不同,优先用 long long 或固定大小类型(如 int64_t)。
  • 溢出风险
    long int 在 32 位系统中可能溢出,而 long long 更安全。

三、总结与建议

浮点类型

  1. 通用场景用 double
    大多数计算(如物理模拟、图形渲染)足够精确。
  2. 超高精度用 long double
    科学计算或金融领域(但需验证编译器支持)。

整数类型

  1. 优先用 long long
    需要大范围整数时(如处理 64 位时间戳)。
  2. 跨平台用固定类型
    <cstdint> 中的 int64_tuint64_t 替代 longlong long

代码示例

#include <cstdint>

// 明确使用固定大小的类型
int64_t timestamp = 1628064000000LL; 
uint64_t hash = 0xFFFFFFFFFFFFFFFFULL;

// 高精度浮点计算
long double pi = 3.1415926535897932385L;

四、扩展:如何验证类型大小?

使用 sizeof 运算符和 <climits> 头文件:

#include <iostream>
#include <climits>

int main() {
    std::cout << "double 大小: " << sizeof(double) << " 字节\n";
    std::cout << "long double 大小: " << sizeof(long double) << " 字节\n";
    std::cout << "long int 范围: " << LONG_MIN << " ~ " << LONG_MAX << "\n";
    std::cout << "long long 范围: " << LLONG_MIN << " ~ " << LLONG_MAX << "\n";
    return 0;
}

输出示例(Linux x64):

double 大小: 8 字节
long double 大小: 16 字节
long int 范围: -9223372036854775808 ~ 9223372036854775807
long long 范围: -9223372036854775808 ~ 9223372036854775807

通过合理选择类型,可以平衡精度、性能和可移植性。

posted @ 2025-03-24 22:26  Gold_stein  阅读(535)  评论(0)    收藏  举报