左移Float类型

在尝试时遇到编译器错误

float_val=float_val<<1; 

它给出了一个错误,说“错误C2296:'<<':非法,左操作数的类型为'float'”

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

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

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

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

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

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

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

有关更多信息,请参阅此答案 。

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

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

你不能留下float类型的移位对象。

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

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

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

在上面,f应该是256.0。

现在很明显这是有问题的,如果你从128.4开始,因为演员将放弃.4。 您可能不希望首先使用浮动。