我有以下(非常简单)代码:
#include <cstdint>
#include <iostream>
#include <vector>
int main(void)
{
std::vector<int64_t> result;
int64_t seed = 9564738543572813LL;
int64_t fact = 18465439963655325LL;
for (int i = 0; i < 100 ; i++)
{
seed = seed * fact ;
result.push_back(seed);
}
std::cout << result[0] << ", " << result[1] << std::endl ;
}
如果我像这样编译并运行就OK了
g++ a.cpp -o a
./a
3551237700689479225, 6924873214268169461
但是如果我要求 -O3 优化,结果会很奇怪!
g++ -O3 a.cpp -o a
./a
9223372036854775807, 9223372036854775807
我做错了什么? 我在 Ubuntu 22.04 上使用 g++ 11.4.0
我做错了什么?
有符号乘法溢出在 C 编程语言中是未定义。 GCC 也有相关文档 https://www.gnu.org/software/c-intro-and-ref/manual/html_node/Signed-Overflow.html 。它不知道你的代码的结果应该是什么 - 它可以是任何东西。另请参阅 https://www.gnu.org/software/c-intro-and-ref/manual/html_node/Signed-Overflow.html .