对于以下代码
static inline float fix2float(int64_t f)
{
return (float)f / (1 << 60); // <-- error here
}
编译器向我发出这些警告。
warning: left shift count >= width of type
warning: division by zero
为什么编译器在 64 > 60 时发出这些警告?
1
不是您的 C 实现中的 64 位数字。它是一个int
,可能是 32 位。
编译器不会检查表达式并发现有一个int64_t
涉及,因此其他算术应该使用 64 位。它从它们的部分构建表达式。在部分(1 << 60)
,编译器识别一个并给它一种类型int
,因为这就是 C 规则对简单常量值所做的规定(还有针对十六进制表示法、后缀和大值的附加规则)。所以,1 << 60
试图改变一个int
60 位。自从int
在你的系统上只有 32 位,编译器会警告你。
A better way to write this is return f * 0x1p-60f;
. 0x1p-60f
is a float
constant with value 2–60.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)