为何计算大整数立方需将初始变量声明为long long?
整数立方计算的类型溢出问题解析
先明确核心数值:106的立方是1018,必须确保选用的数据类型能容纳这个值,否则必然出现计算错误。
关于long long和long long int的误区
这两个在C++里是完全等价的类型别名,不存在“用long long int不行、换long long就正常”的本质差异。你之前遇到的问题大概率是代码细节出错——比如输入变量实际是int类型,而非long long int:
举个典型错误示例:
int t; cin >> t; long long int ans = t*t*t;
这里t是32位int,最大值仅约2e9,t*t会先以int类型计算,106×106=1e12,远超int的取值范围,直接溢出成无效值,后续再乘t或转成long long int也无法修正错误。而把t改成long long后,所有乘法都是64位整数运算,long long的取值范围是-9e18到9e18,完全能容纳1e18,计算结果自然正确。
为什么size_t不行
size_t是无符号整数类型,其大小与系统指针位数一致:
- 32位系统中size_t为32位,最大值约4e9,1e18远超范围,计算时直接溢出,结果全错;
- 即使是64位系统,size_t是64位无符号类型(最大值约1.8e19),能容纳1e18,但如果输入负数(哪怕你限定输入为正整数,万一出现负输入场景),无符号类型会将负数转换为超大正数,导致结果完全偏离预期。而且用无符号类型存储可能为负的整数,本身就是不合理的设计。
直接用cout输出的情况
如果输入变量是int,哪怕直接写cout << t*t*t;,也是先执行int类型的乘法溢出,再转换为输出类型,结果依然错误。只有当t是long long时,乘法才会以64位整数运算,输出结果才正确。
正确代码示例:
#include <bits/stdc++.h> using namespace std; int main(){ long long t;cin>>t; long long ans=t*t*t; cout<<ans; return 0; }
内容的提问来源于stack exchange,提问作者Aditya Raj
相关产品推荐
相关产品推荐

