左移浮动类型

时间:2012-02-16 16:59:37

标签: c floating-point floating-point-conversion

尝试执行时出现编译器错误

float_val=float_val<<1;

它发出错误说“错误C2296:'&lt;&lt;' :非法,左操作数的类型为'float'“

不能左移左浮球?为什么会这样?

7 个答案:

答案 0 :(得分:13)

你不能离开float变量,因为(a)你的FPU通常不会有一个桶式移位器暴露给你,所以物理上无法生成代码来做到这一点,以及(b)它会是什么甚至意味着?基础位表示由多个具有不同含义的字段组成,您真的希望这些位相互渗透吗?

如果你想将该变量中的数字乘以2,你应该这样做。

如果你想重新解释float,因为某些类型的左移有意义(例如一个适当大的无符号整数类型),对于像Carmack的平方根这样的可怕的黑客攻击,嗯,你也可以这样做,但在现代硬件上,你真的不太可能需要:认真考虑是否有更好的方法来做你想做的事。

答案 1 :(得分:4)

如果你想快速乘以或除以2的幂,请检查标准函数ldexpf。显然有点模糊: - )。

https://linux.die.net/man/3/ldexpf

答案 2 :(得分:1)

浮点数在值表示级别没有位,这就是为什么你不能对它们应用按位运算。

有关详细信息,请参阅this answer

答案 3 :(得分:1)

移动浮动是没有意义的,因为它表示为符号位,指数和尾数的串联。由于移位操作是关于移位,这意味着将位从尾数移位到指数和/或移位符号位。

答案 4 :(得分:1)

由于左移位运算符被定义为乘以2的幂,因此对于浮点类型非常有意义。但是,C语言没有定义它的用法,所以你必须使用scalbn函数或类似函数。

答案 5 :(得分:0)

您无法保留float类型的移位对象。

C表示按位移位运算符的操作数应为整数类型。

答案 6 :(得分:-1)

你必须先将浮动变换为其他东西。如:

float f = 128;
f = (float) (((int) f) << 1 );

在上面,f应该是256.0。

现在很明显,如果你从128.4开始,这会有问题,因为演员阵容会掉落.4。你可能不想在第一时间使用浮动。