7

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

float_val=float_val<<1;

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

v 不能左移浮点变量吗?为什么会这样?

4

7 回答 7

18

您不能离开移位float变量,因为(a)您的 FPU 通常不会有桶形移位器暴露给您,因此物理上无法生成代码来执行此操作,以及(b)它甚至意味着什么?底层位表示由多个具有不同含义的字段组成,您真的希望这些位相互渗透吗?

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

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

于 2012-02-16T17:05:59.650 回答
5

如果您想快速将浮点数乘以或除以 2 的幂,请查看标准函数 ldexpf。显然有点晦涩:-)。

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

于 2016-12-12T19:33:32.250 回答
2

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

于 2012-02-16T17:08:58.277 回答
1

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

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

于 2012-02-16T17:04:20.537 回答
1

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

于 2012-02-16T17:30:15.390 回答
0

您不能左移float类型的对象。

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

于 2012-02-16T17:11:31.970 回答
-2

您必须先将浮动转换为其他东西。如:

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

在上面,f 应该是 256.0。

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

于 2012-02-16T17:07:46.463 回答