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 の累乗で乗算または除算する場合は、そのまま実行してください。浮動小数点数の表現方法により、シフトはそのようには機能しません。

float のビット パターンを実際にシフトしたい場合は、キャストを行うか、union を使用する必要があります。

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

いいえ、float のバイナリ表現は不透明でなければならないためです (実際に 2 で割るには、仮数を減分する必要があります)。*0.5f代わりに使用してください。

本当にバイナリ表現をシフトしたい場合 (Quake の平方根のように)、 with を使用unionunsignedます。

于 2010-11-14T16:15:46.903 に答える
0

なぜ double を右シフトしたいのですか? f / 2.0代わりに、それが必要な場合はできます。

于 2010-11-14T16:15:45.667 に答える
-1

シフト演算子は、C++ の整数型に対してのみ定義されています。56.34 >> 1.0とにかく結果として何を期待しますか?

于 2010-11-14T16:15:52.907 に答える