这个问题在这里已经有答案了:
long [long long是8字节,但我得到的是整数overflow?(1个答案)
为什么long long n = 2000*2000*2000*2000;溢出?(6个答案)
三年前就关门了。
我有一个简单的c++应用程序,它执行以下计算
long long calcOne = 3 * 100000000; // 3e8, essentially
long long calcTwo = 3 * 1000000000; // 3e9, essentially
long long calcThree = 3 * 10000000000; // 3e10, essentially如果我编写每个计算的结果,我会得到以下输出:
calcOne = 300000000
calcTwo = -1294967296
calcThree = 30000000000那么为什么第二次计算会失败呢?据我所知,它在long long类型的范围内(calcThree更大...)。
我正在Windows 10上使用Visual Studio 2015。提前谢谢。
发布于 2017-03-23 02:56:17
缺省情况下,整数常量为ints.
1000000000可以放入int..。因此,这个常量被解析为int..。但是乘以3会使int溢出。
10000000000这对于int来说太大了,所以这个常量是一个long long,因此产生的乘法不会溢出。
解决方案:显式使用long long常量:
long long calcOne = 3 * 100000000LL; // 3e8, essentially
long long calcTwo = 3 * 1000000000LL; // 3e9, essentially
long long calcThree = 3 * 10000000000LL; // 3e10, essentially发布于 2017-03-23 02:54:46
您对结果所做的操作不会影响该结果的计算方式。因此,将结果存储在long long不会改变这样一个事实,即您在第二行代码中相乘的数字不是long longS,所以它们溢出了。在第三行代码中,常量是一个long long,所以乘法是在long longs.
发布于 2017-03-23 02:59:41
编译器看到了这一点
long long calcOne = (int) 3 * (int) 100000000; // 3e8, essentially
long long calcTwo = (int) 3 * (int) 1000000000; // 3e9, essentially
long long calcThree = (int) 3 * (long long) 10000000000; // 3e10, essentially因此,calcTwo右手边的值被推断为int键入,然后溢出。您将溢出视为负长。
long long calcOne = 3LL * 100000000LL; // 3e8, essentially
long long calcTwo = 3LL * 1000000000LL; // 3e9, essentially
long long calcThree = 3LL * 10000000000LL; // 3e10, essentially为了避免以后发生这种情况,请明确说明静态values.To的类型,告诉编译器一个数字是一个long longpost用LL修复它。
https://stackoverflow.com/questions/42960290
复制相似问题