C++算术溢出(VS2019,C++17)
#include
using namespace std;
int main() {
long long a = 4'294'967'296L; // 正确
cout << a << endl;
long long b = 16777216L*4096L; // 乘法结果得到0。这是为什么?
cout << b << endl;
return 0;
}
4294967296
0
试过把编译器改为x64,但问题依旧
16777216L*4096L;
2个数按long进行计算,结果赋值给long long。
而上面式子按long运算的结果是溢出为0的。
先把其中一个给long long,然后在计算就不会溢出了。
long long b = 16777216L;
b *= 4096L;
long 溢出了
long long b = 16777216LL*4096L;//这样就不会溢出了
VS编译器认为的long是32位数,long long是64位 ,而问题中的 long long b = 16777216L4096L; 其中b的结果是在编译生成程序之前就编译器会把结果计算出来,这不是程序执行才计算出来的,就是说代码写着是long long b = 16777216L4096L; 实际上编译完之后,b是一个确定的值保存在程序的代码段。编译时,会根据你算子中数据的格式去计算出算子的结果,16777216L*4096L ,中的L标志了这个数据类型为 long类型,编译从左到右按照long类型去计算,实际上这是编译器计算出错了,给你返回了一个无效值,并不是程序数据溢出。数字标志应该选用合理的标志, 如long t = 2134L ,long long t = 2345LL , float t = 0.234f .....
你在干什么呀,这两个数乘完是68'719'476'736,也不是4'294'967'296啊,你在搞什么呀