[当我使用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++)
这种差异的原因可能是什么?
scale
的值不能表示为int
(或者如果它的绝对值无法表示),则编译器将为您提供不同的结果 因为它们被“允许”!
从cppreference forstd::abs
开始(对于全局名称空间std::abs
函数也是如此:计算整数的绝对值。该行为是如果结果不能由返回类型表示,则为undefined。顾名思义,
未定义的行为是
undefined
。 在第二种情况下,表示abs
的值大概没有问题,因为scale
接受fabs
自变量,然后返回double
。