ここで参照が関与する、素敵なビット演算を持つビット・コンピューティングが発生する可能性のある符号質問オーバーフローの問題に対処する方法については。
参考:
1. https://www.cnblogs.com/myblesh/articles/2431806.html
2.のようだ:オリジナルの作者:http://hi.baidu.com/todaygoodhujun/blog/item/b8c10dd15ae4dfd3572c8417.html
第1の左は言っ、すべてのビットがビットの左数に移動される数に左、C 用い<< 演算子。例えば:INT 1 =私は; I = I << 2; // i個のレーン左側の値は2 ビットである1 へ2 のバンドは、000 ... 0001(ここで正面0 数およびINT のためのビット32 ビットマシン、GCC 、そこ31はTHが0)、左2 ビットになった後000 ... 0100 である10 進4、左ので、1 を乗じたビット当量2、次いで左
N ビットは、乗算される2 において、N 番目のパワー(符号付き数は完全に適用できない、左が符号の変化につながる可能性があるため、以下の理由を説明する)問題があることに留意されたいINT タイプ左端の符号ビットシフトとシフトアウト状況。我々はそれを知っているintは、整形手術の符号付き数であり、左端の1 ビットは符号ビットであり、すなわち0 正1 負、オーバーフローが存在するであろう、シフト、例えば:; // 16 int型I = 0x40000000からに作られた、4000万のために2 進01000000 0000 ... 私は= I << 1; まあ、私は左の1 ビットの後にはなりますが0x80000000、
ある2 進100 000 ... 0000は、符号ビットに設定されている1、他のビットが全て0 となるINT 最小タイプで表すことができる32 ビットのint 値があり、-2147483648 オーバーフロー。我々場合その後、私は左1 起こるどの位置?にC 言語処理方法の最も高いレベルを捨て使用、廃棄いずれかをした後、私は、価値がなる0 が左むしろ特殊なケースに残っています時間シフトは、数値型の最大桁数を超えて、コンパイラは、型の最大ビット数を死ぬことを左のビット数が使用され、そして私の数だけずらし、等:= I. 1 INT、J =は0x80000000; / / 設定INTがある32 ビット
I = I << 33; // 33 32%= 1 左1 ビット、I に2
。J = 33 J <<あり; = 32%1 // 33れる左1 ビット、jはなる0、最上位ビットであるが廃棄とGCC このプログラムをコンパイル時間コンパイラが与えられる警告は、左シフト・カウント前記> = 型の長さが。さて、実際にI、Jの動きである。1 ビット、すなわち33%32 余り後。にgccのこのルールの下では、他のコンパイラは、それが明確ではないが、すべて同じではありません。短い左にある:MSB破棄し、0を最下位ビットを埋める右に言って、左の真実を理解するために、
そう権利がより良く理解される。左右逆の概念は、すなわち、ビットの適切な数に移動し、オペレータは>>。契約と左ビット別に署名する権利、それは符号付き整数であるため、例の場合はint型のタイプ、右符号ビットが変更されないままシフト、例えば:I = 0x80000000のint型; I = I >> 1; // Iの。値はなりません0x40000000から、しかしなり0xc0000000 あり、右に符号ビット移動後、正の数、次に補体0、最大負1、すなわち、アセンブラ言語算術右シフト。タイプ長さにわたって桁移動が同様とき、残りを取る、そして次いで残りのビットを移動させる。負10100110 >> 5 (仮定ワードサイズ8 ビット
)、その後、取得され 11111101 要約、Cの中で、左が論理/ 左算術シフト(二つの同一)、右算術右シフト、不変の符号ビットが残る。練習は、いくつかの場合には残されてもよいです/ 右の迅速な乗算を行う/ 除算演算を、これはサイクル効率よりもはるかに高いだろう。 参照:http://hi.baidu.com/todaygoodhujun/blog/item/b8c10dd15ae4dfd3572c8417.html Cのシフト操作言語、コンテンツあまりありません。しかし、あなたは注意を払っていないいくつかの場所で、それは過失です。 最初に行うために、2つの小さな問題。(1)X-unsigned char型= 3; X - << 1は、数ですか?X >> 1は数ありますか?(2)X-チャー= 3; X - << 1は数でありますか?X >> 1は数ありますか?
(3)X-チャー= -3; X - << 1は数でありますか?X >> 1は数ありますか?3 進数書き込み00000011を、-3 バイナリで書かである(補体)11111101 。 プログラムの実行は、オペレーションコードは、バイナリ値をメモリ内に表されている数値表現です。例えば、プログラムがかかる-3 時間はフェッチう11111101を。(1)符号なしの数3 であり、X - << 1 左の、右端のシフト入力ビットゼロオフ左端変位します。なる00000110 、結果は6。X; >> 1。右シフト一方に、それは符号なしであるため、論理右シフト、明確変位右端、ゼロパディングを着信左端のビットシフトとなる00000001 、結果は1 。(2)シンボルの数については3 であり、X - << 1 左のいずれかに、右端のシフト入力ビットゼロオフ左端の変位。なります
00000110 、結果があるので、6 ; X - >> 1 右のいずれかにシフトするため、それが署名された数であるので、それが正しい論理、算術右シフトでもある、発生する可能性が発生する可能性があり、Cの標準は、明示的に正しい論理を使用することを指定しませんまたは右に算術シフト。しかし、ほとんどのマシンが右に算術シフトを使用している00000001 、その結果はでした1 。しかし、これはマシンのほとんどは、あなたは彼が特別な状況に実行されないことを保証できるようなものであると言うことだけで、注意してください?(3)符号付きの場合-3 言えば、X - << 1 左の、右端のシフト入力ビットゼロオフ左端の変位。なる11111010 、結果は-6 。それは符号付き数であるので、右のいずれかに、それが正しい論理を発生する可能性があり、算術右シフトも起こり得ます。ほとんどのマシンが右に算術シフトを使用11111110 、結果は-2 。 概要:常に左側にゼロをシフトして作ります。数が符号なし右シフトと、ゼロパディングされている場合、この時間は、論理右シフトと呼ばれ、シンボルの数がシフトアップされるほとんどの場合ながら左端のビット(最上位ビット補数である)、いくつかのシフトいくつかを補うために、この時間は、算術右と呼ばれます。 印刷メモリのバイト符号化コードを取り付ける: ボイドPRINT_CHARを(チャーX)
{
unsigned char型の*のBP =(unsigned char型の*)・X;
INTサイズ=さはsizeof(X)
(;私はサイズを<I ++はiが0 = INT)のため
のprintf( "%2X"、BP [I])。
printf( "\ n")を。
}