C++中定义long long 类型变量该注意的问题

本文通过实例详细解析了C语言中整型变量溢出的问题,特别是int和long long类型的处理差异。揭示了小于INT最大值的常数自动保存为INT类型,以及INT与INT相乘导致的溢出现象,最后提供了使用long long类型避免溢出的解决方案。
//首先先知道 int 和 long long 最大值各为多少
printf("%d\n", INT_MAX);  //输出2147483647
printf("%lld\n", INT64_MAX);//输出9223372036854775807
//开始定义
long long x = 2468 * 100000000; //原以为 = 246800000000 < long long最大值
printf("%lld\n", x); 	结果输出-1894967296 明显溢出

问题出在哪里??

//打印 X 的内存空间
printf("%d\n", sizeof(x));  //输出 8 也没错

问题在于:

printf("%d\n", sizeof(2468));   //输出 4  int类型
printf("%d\n", sizeof(100000000));	//输出4	int类型2468 * 100000000 也保存在 int中 导致溢出 溢出的结果赋值给x 也溢出

解决

long long a = 2468, b = 100000000;
long long x = a * b;
printf("%lld\n", x);	正常输出

总结

小于INT最大值的常数,自动保存为INT类型

INT * INT 得到的结果也是INT,即使赋值给 long long 也有溢出的情况发生

如果数据太大 建议用 long long = long long * long long 保证不溢出

### C++ 中 `long long` 类型的使用与特性 在 C++11 标准中,`long long` 被引入作为一种新的整数类型,用于表示至少 64 位的整数值[^2]。以下是关于 `long long` 类型的一些关键特性和使用方法: #### 1. **存储空间** `long long` 类型在大多数平台上占用 8 字节(64 位)的空间,能够表示非常大的整数值。C++ 标准规定该类型的最小范围为 -9,223,372,036,854,775,807 到 9,223,372,036,854,775,807(即从 `-2^63` 到 `2^63-1`)。对于无符号版本 `unsigned long long`,其范围是从 0 到 18,446,744,073,709,551,615(即从 `0` 到 `2^64-1`)[^1]。 #### 2. **字面量后缀** 为了初始化 `long long` 类型变量,可以使用 `LL` 或 `ll` 作为有符号字面量的后缀,而对于无符号字面量则可以使用 `ULL` 或 `ull` 后缀。例如: ```cpp long long x = 1234567890123456789LL; // 有符号 unsigned long long y = 1234567890123456789ULL; // 无符号 ``` #### 3. **最大和最小值** 可以通过 `<climits>` 头文件中的宏来获取 `long long` 类型的最大和最小值。例如: ```cpp #include <iostream> #include <climits> int main() { std::cout << "Min Long Long value: " << LLONG_MIN << std::endl; std::cout << "Max Long Long value: " << LLONG_MAX << std::endl; std::cout << "Max unsigned Long Long value: " << ULLONG_MAX << std::endl; return 0; } ``` 上述代码将输出 `long long` 和 `unsigned long long` 的范围[^3]。 #### 4. **跨平台差异** 尽管 C++11 标准规定了 `long long` 至少为 64 位,但在某些特殊平台上,可能会实现更大的存储空间。因此,在需要精确控制数据宽度时,建议使用 `<cstdint>` 提供的固定宽度整数类型,如 `int64_t` 和 `uint64_t`[^4]。 #### 5. **类型转换** `long long` 类型支持与其他整数类型进行隐式和显式转换。然而,需要注意的是,在不同平台或编译器上,由于数据模型的不同(如 LP64、LLP64 等),可能会导致意外的行为。因此,在涉及跨平台编程时,应特别注意类型转换规则[^5]。 #### 6. **应用场景** `long long` 类型常用于需要处理大整数的场景,例如高精度计算、大数据处理以及科学计算等领域。此外,在嵌入式系统开发中,也可能需要使用该类型以确保足够的存储空间。 --- ### 示例代码 以下是一个简单的示例,展示如何定义和操作 `long long` 类型变量: ```cpp #include <iostream> #include <climits> int main() { long long max_value = LLONG_MAX; long long min_value = LLONG_MIN; unsigned long long ull_max_value = ULLONG_MAX; std::cout << "Max signed long long: " << max_value << std::endl; std::cout << "Min signed long long: " << min_value << std::endl; std::cout << "Max unsigned long long: " << ull_max_value << std::endl; long long large_number = 9223372036854775807LL; std::cout << "Large number: " << large_number << std::endl; return 0; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值