C 左移浮动式

C 左移浮动式,c,floating-point,floating-point-conversion,C,Floating Point,Floating Point Conversion,尝试执行此操作时出现编译器错误 float_val=float_val<<1; float_val=float_val浮点数在值表示级别没有位,这就是为什么不能对它们应用逐位运算 有关更多信息,请参阅。您不能左移浮动变量,因为(a)您的FPU通常不会暴露桶形移位器,因此物理上无法生成执行此操作的代码,以及(b)这意味着什么?底层位表示由多个具有不同含义的字段组成,您真的希望这些位相互渗透吗 如果你想把这个变量中的数字乘以2,你应该这样做 如果您想将浮点重新解释为左移位对某些可怕的位

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

float_val=float_val<<1;

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


有关更多信息,请参阅。

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

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


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

< P>你必须先把浮标转换成别的东西。例如:

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

f=(float)(((int)f)移位float毫无意义,因为它表示为符号位、指数和尾数的串联。因为移位操作是关于移位位的,它意味着将位从尾数移位到指数和/或符号位。

不能将
float
类型的对象左移位


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

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

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


在浮点情况下,您希望如何准确地进行移位?我想,与int(2的幂)相同,因为浮点的不同位有不同的含义,所以在浮点上进行位移位没有意义。一个好的读数:可能是+1的重复。但是为了学究,FPU几乎肯定会有一个桶形移位器,因为进行浮点加法几乎需要桶形移位器。@Oli:但即使你能控制它,它也不会移动整个浮点,只是移动尾数。。。我会澄清的。没关系,你的答案已经很好了。我只不过是一个刻板的书呆子!在amd64上,FP数学通常在SSE寄存器中完成。没有什么能阻止您在这些寄存器上使用整数左/右移位。(除了结果对任何事情都没有多大用处这一事实!)