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

时间:2020-02-18 20:38:33

标签: c++ gcc g++ clang clang++

当我使用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++)

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

2 个答案:

答案 0 :(得分:1)

请参阅本帖子的answerabs通常用于整数,fabs用于浮点类型。但是,看来abs的G ++实现也将处理浮点数。

答案 1 :(得分:1)

此代码产生相同的结果吗?对我来说,似乎不是:https://godbolt.org/z/Wj9v6j

#include <iostream>
#include <cmath>

using namespace std;

using float32_t = float;

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


int main() {
    int32_t result;
    ScaleFactor(0.234375f, result);
    return 0;
}

如果没有,您确定这里没有其他问题吗?也许您包括数学函数的C版本,而使用clang进行构建时,abs和fabs有所不同?

您得到的怪异结果恰好是将float传递给abs时将float转换为int所得到的结果,正是您使用C版本的abs所期望的结果。

相关问题