C++乘法输出异常疑为编译器Bug?为何100000*100000输出1410065408?
为什么
100000 * 100000 输出 1410065408 而不是 10000000000? 这绝对不是编译器的Bug,而是整数溢出导致的经典问题,咱们一步步拆解:
- 首先,C++里默认的整数常量(比如
100000)是int类型,而大多数系统上的int是32位的,它能表示的最大值是2147483647(也就是2^31 - 1,大概21亿)。 - 当你计算
10000 * 10000时,结果是100000000(1亿),这个数远小于21亿,所以能被int正常存储,输出自然正确。 - 但
100000 * 100000的结果是10000000000(100亿),这远远超过了32位int的最大值。此时会发生有符号整数溢出,而C++标准里规定这种行为是未定义行为——不过在大多数编译器(比如GCC、Clang、MSVC)中,会按照补码的循环规则来处理,也就是把结果对2^32取模:
这就是你看到的奇怪输出的由来。10000000000 % 4294967296 = 1410065408
怎么解决这个问题?
只需要让计算过程使用更大范围的整数类型就行,比如long long(至少64位,能表示到9e18):
- 方法一:把其中一个常量显式转换为
long long:cout << static_cast<long long>(100000) * 100000; - 方法二:在常量后面加
LL后缀,让它变成long long类型:cout << 100000LL * 100000;
这样计算时会自动提升为long long类型,结果就能正确存储为10000000000了。
内容的提问来源于stack exchange,提问作者DeehoroEjkoli
相关产品推荐
相关产品推荐

