私は絶対にここで狂っている必要がありますが、私のマシン上のgcc 4.7.3
は最も不条理な結果を与えています。ここで私はテストだ正確なコードです:算術右シフトは偽の結果をもたらしますか?
#include <iostream>
using namespace std;
int main(){
unsigned int b = 100000;
cout << (b>>b) << endl;
b = b >> b;
cout << b << endl;
b >>= b;
cout << b << endl;
return 0;
}
は今、右にそれ自体でシフトしています任意の数は、(整数除算、n>1
、そして正/符号なしとn/(2^n) == 0
)を生じるはずです何とかここに私の出力です:
100000
100000
100000
私はクレイジーですか?おそらく何が起こっているのでしょうか?
@ShafikYaghmour:これはコンパイラを前提としています指示をすることさえ気にする。このプログラムを拒否する権利は十分です。 – MSalters
@MSalters確かに、現時点ではコンパイラ/プラットフォーム/バージョン固有のものになっていますが、現在と最近のバージョンではこれが当てはまります。すでに述べたように、あなた自身がはっきりしているので、 'gcc'は'-O0'を使うとき' shr'を生成します。 –
@ShafikYaghmour:Intelはgccがサポートする多くのプラットフォームの1つに過ぎず、最適化の段階が異なります。最適化の一般的なやり方は、「この値はシフトで使用されるため0から31の間でなければなりません。コードパスXに従うと値が0から31にならないのでコードパスXは不可能です私はそれについての指示を生成する必要さえもありません。 GCCは、ヌルポインタチェックのためにこれを実行します。 – MSalters