g++ 上的 -O3 选项引起的算术错误[重复]

问题描述 投票:0回答:1

我有以下(非常简单)代码:

#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++ g++ compiler-optimization
1个回答
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 .

© www.soinside.com 2019 - 2024. All rights reserved.