首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >3* 1000000000作为整型溢出,但变量为long long。为什么?[复制]

3* 1000000000作为整型溢出,但变量为long long。为什么?[复制]
EN

Stack Overflow用户
提问于 2017-03-23 02:50:12
回答 4查看 4K关注 0票数 7

这个问题在这里已经有答案了

long [long long是8字节,但我得到的是整数overflow?(1个答案)

为什么long long n = 2000*2000*2000*2000;溢出?(6个答案)

三年前就关门了。

我有一个简单的c++应用程序,它执行以下计算

代码语言:javascript
复制
long long calcOne = 3 * 100000000;     // 3e8, essentially
long long calcTwo = 3 * 1000000000;    // 3e9, essentially
long long calcThree = 3 * 10000000000; // 3e10, essentially

如果我编写每个计算的结果,我会得到以下输出:

代码语言:javascript
复制
calcOne = 300000000
calcTwo = -1294967296
calcThree = 30000000000

那么为什么第二次计算会失败呢?据我所知,它在long long类型的范围内(calcThree更大...)。

我正在Windows 10上使用Visual Studio 2015。提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-03-23 02:56:17

缺省情况下,整数常量为ints.

代码语言:js
复制
1000000000

可以放入int..。因此,这个常量被解析为int..。但是乘以3会使int溢出。

代码语言:js
复制
10000000000

这对于int来说太大了,所以这个常量是一个long long,因此产生的乘法不会溢出。

解决方案:显式使用long long常量:

代码语言:javascript
复制
long long calcOne = 3 * 100000000LL;     // 3e8, essentially
long long calcTwo = 3 * 1000000000LL;    // 3e9, essentially
long long calcThree = 3 * 10000000000LL; // 3e10, essentially
票数 11
EN

Stack Overflow用户

发布于 2017-03-23 02:54:46

您对结果所做的操作不会影响该结果的计算方式。因此,将结果存储在long long不会改变这样一个事实,即您在第二行代码中相乘的数字不是long longS,所以它们溢出了。在第三行代码中,常量是一个long long,所以乘法是在long longs.

票数 2
EN

Stack Overflow用户

发布于 2017-03-23 02:59:41

编译器看到了这一点

代码语言:javascript
复制
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键入,然后溢出。您将溢出视为负长。

代码语言:javascript
复制
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修复它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42960290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档