在尝试进行操作时出现编译器错误
float_val=float_val<<1;
出现错误,提示“error C2296: '<<' : 非法,左操作数的类型为 'float'”
不能对浮点变量进行左移操作吗?为什么会这样呢?
在尝试进行操作时出现编译器错误
float_val=float_val<<1;
出现错误,提示“error C2296: '<<' : 非法,左操作数的类型为 'float'”
不能对浮点变量进行左移操作吗?为什么会这样呢?
你不能对 float
变量进行左移操作,因为 (a) 你的浮点运算单元(FPU)通常不会将位移器暴露给你,因此在物理上无法生成执行该操作的代码;(b) 这甚至意味着什么?底层的位表示由多个具有不同含义的字段组成,你真的希望这些位相互渗透吗?
如果你想将该变量中所保存的数字乘以二,你应该直接这样做。
如果你想将浮点数重新解释为一些可以进行左移操作的类型(例如充分大的无符号整数类型),以便进行一些可怕的位操作,比如 Carmack 的平方根,那么你也可以这样做,但在现代硬件上,你真的需要这样做吗?请认真考虑是否存在更好的方法来实现你想要的功能。
由于左移运算符被定义为乘以2的幂,因此对于浮点类型来说是非常合理的。然而,C语言并没有定义其使用方式,因此您必须使用scalbn
函数或类似函数。
你不能对 float
类型的对象进行左移操作。
C 语言规定位移运算符的操作数必须是整数类型。
你需要先将浮点数转换为其他类型,例如:
float f = 128;
f = (float) (((int) f) << 1 );
在上面的例子中,f 应该是 256.0。
显然,如果你从 128.4 开始,这会有问题,因为强制转换会丢失小数点后的 .4。你可能不想一开始就使用浮点数。
*2
。如果您真的在进行位移(即使用位字段的硬件寄存器),则应编写<<1
。无论哪种方式,编译器都会生成完全相同的机器代码。尝试使用位移来缩放浮点数的幂次是编写晦涩代码的行为。相信您的编译器能够生成高效的机器代码,只需编写清晰易懂的代码即可。 - Michael