溢出原因(G ++与Clang ++)

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

[当我使用Clang ++和G ++编译以下C ++代码时

void ScaleFactor(float32_t scale, int32_t &factor) {
    factor = floor(log2(abs(scale))+1)
    cout << factor << endl;
}

其中scale的值等于0.234375,并且factor通过引用传递给另一个函数中的整数变量,在使用GDB进行调试时,我得到factor的以下不同输出

(int32_t &) @0x7fffffffdaa0: -2147483648 (Clang++)
(int32_t &) @0x7fffffffda9c: -2 (G++)

但是,用abs()替换fabs()时,每个输出都与所需的输出匹配

(int32_t &) @0x7fffffffdb90: -2 (Clang++)
(int32_t &) @0x7fffffffdddc: -2 (G++)

这种差异的原因可能是什么?

c++ gcc g++ clang clang++
1个回答
0
投票
在第一种情况下,假设您有scale的值不能表示为int(或者如果它的

绝对值无法表示),则编译器将为您提供不同的结果 因为它们被“允许”!

cppreference for std::abs开始(对于全局名称空间std::abs函数也是如此:

计算整数的绝对值。该行为是如果结果不能由返回类型表示,则为undefined。
顾名思义,

未定义的行为是

undefined

在第二种情况下,表示abs的值大概没有问题,因为scale接受fabs自变量,然后返回double
© www.soinside.com 2019 - 2024. All rights reserved.