C++当中long int vs long long int & long double vs double
C++当中long int vs long long int & long double vs double
内容
在 C/C++ 中,double、long double 和 long int、long long 的区别主要在于 精度、存储大小和用途。以下是详细对比:
一、浮点类型:double vs long double
| 特性 | double (双精度) |
long double (扩展双精度) |
|---|---|---|
| 存储大小 | 通常 8 字节 (64 位) | 通常 10~16 字节 (如 80 位或 128 位) |
| 有效十进制精度 | 约 15~17 位 | 约 18~34 位 |
| 标准要求 | 必须支持,精度 >= float |
由编译器实现决定,精度 >= double |
| 典型用途 | 通用高精度计算 | 科学计算、金融等需要超高精度的场景 |
| 性能 | 较快 | 较慢(依赖硬件支持) |
| 字面值后缀 | 0.0(默认 double) |
0.0L 或 0.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更安全。
三、总结与建议
浮点类型
- 通用场景用
double:
大多数计算(如物理模拟、图形渲染)足够精确。 - 超高精度用
long double:
科学计算或金融领域(但需验证编译器支持)。
整数类型
- 优先用
long long:
需要大范围整数时(如处理 64 位时间戳)。 - 跨平台用固定类型:
如<cstdint>中的int64_t、uint64_t替代long或long 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
通过合理选择类型,可以平衡精度、性能和可移植性。

浙公网安备 33010602011771号