c++ - 3 * 1000000000 作为int溢出,但是变量是long long。为什么?

标签 c++ literals integer-overflow long-long

<分区>

我有一个简单的 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。提前致谢。

最佳答案

默认情况下,整数常量是 int

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

关于c++ - 3 * 1000000000 作为int溢出,但是变量是long long。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42960290/

相关文章:

c++ - 如何将字符串数组转换为 SAFEARRAY 或 VARIANT 或 COleVariant?

字符串中的 Swift 日期文字/日期初始化

string - TypeScript React Native String 文字赋值错误

javascript - 现在有多少位可用于 JS 风格的 "integer"数学?

c++ - Visual C++ 链接器错误 2019

c++ - 我需要帮助创建一个最小的示例,显示我的系统上的 openMP 加速情况

c++ - 为什么这段代码不能按预期工作?

c++ - 是否可以将指针传递给文字?

rust - 如何在不溢出的情况下对另一个数字进行算术模运算?

c - 我应该使用C中的十六进制数字格式来执行算术吗?