5

我有以下代码

#include <iostream>
using namespace std;
int main(){

float f=56.34f;
double d=12.34101;
cout<<(f>>1.0)<<endl;
cout<<(d>>1.0)<<endl;


return 0;
}

但它不起作用,并且出现此错误:

在函数'int main()'中:第7行:错误:'float'和'double'类型的无效操作数到二进制'operator>>'编译由于-Wfatal-errors而终止。

这里允许在 C/C++ 编译器中右移吗?我正在使用视觉工作室 2010。

4

5 回答 5

8

那是因为,在 C++ 被移植到量子计算机之前,你不能移动半

换句话说,移位运算符 >>支持浮点操作数是没有意义的。然而。

于 2010-11-14T16:16:25.127 回答
6

您不能转换非整数类型。这在 C++ 中是非法的。

如果您要乘以或除以 2 的幂,那么就这样做。由于浮点数的表示方式,移位不像浮点数那样起作用。

如果你真的想改变浮点数的位模式,那么你需要做一些转换,或者使用联合。

union
{
  float f;
  int i;
} u;
u.f = 56.34f;
u.i >>= 1;
cout << u.f << endl;

但是你得到的值是完全没有意义的(你不是除以 2)。

于 2010-11-14T16:16:10.063 回答
1

不,因为浮点数的二进制表示应该是不透明的(实际上要将其除以 2,您应该减少尾数)。改为使用*0.5f

如果你真的想改变二进制表示(比如在 Quake 平方根中),使用unionwith unsigned

于 2010-11-14T16:15:46.903 回答
0

为什么要右移双倍?f / 2.0如果那是你想要的,你可以改为。

于 2010-11-14T16:15:45.667 回答
-1

移位运算符仅在 C++ 中为整数类型定义。无论如何,您会期望什么结果56.34 >> 1.0

于 2010-11-14T16:15:52.907 回答