1

私はC言語について学んでいます。私はこのコードを持っています。必要に応じてさらに提供できます。

int result = 0;
int mask1 = 0x0000ffff;
mask1 = mask1 >> 28;

これは、gdbとprintを使用すると/x mask10x0正しい値になります。では、なぜですか。

int result = 0;
int mask1 = 0xffffffff;
mask1 = mask1 >> 28;

print 0xffffffff

0x0000000f28ビットシフトしたままなので、印刷するべきではありませんか?

それは私の64ビットマシンでintが占めるビット数と関係がありますか?私はこれを見ましが、それはすべてに完全に答えることはできませんでした。

4

5 に答える 5

5

負の整数での右シフトの動作は、実装によって定義されます。一般的な動作の1つは、符号拡張を行う算術シフトです。その利点は、正の数の場合と同様に、右シフトも2の累乗(負の無限大に丸められる)で除算されることです。

于 2012-08-30T21:58:12.820 に答える
1

あなたはにシフトしています。これは右です:>>、そしてこれは左です:<<

一般に、(符号付き)整数を右にシフトすると、は変更されますが、符号は変更されないと見なされます。これは、ダニエルが符号拡張によって意味するものです。これは標準では必須ではなく、すべてのプラットフォームがこれを行うわけではありません。

実際には、2の補数を使用するシステムでは、負の値は新しい上位ビットがで埋められ1、正の値はで埋められることを意味します0

たとえば、8ビット2s補体系の場合:

before          after >> 1
11111110 = -2   11111111 = -1 (so new top bit was 1)
00000010 = +2   00000001 = +1 (so new top bit was 0)
于 2012-08-30T22:07:33.937 に答える
0

0xffffffffを整数として出力すると、-1と見なされることがわかります。

ビットシフトは、最上位のビットを1で埋めるという点で、負の数とは動作が異なります。したがって、基本的に、0xffffffff >> 1==0xffffffffです。

マスクをとして宣言するunsigned intと、おそらくあなたが望むことをするでしょう。

于 2012-08-30T22:06:16.843 に答える
0

負の整数のビット単位の右シフトは、実装によって定義されます。

これが何をするかgccです:

符号付き整数(C90 6.3、C99 6.5)に対するいくつかのビット演算の結果。

符号付きの`>>'は、符号拡張によって負の数に作用します。

http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html

于 2012-08-30T22:19:38.057 に答える
0

はい、@ veerが指摘したようにint、右算術シフトを実行しています。これは、符号付き数値を2の補数表現で除算するのに最適です。

右算術シフト

タイプをunsigned intそれに変更すると、右ビット単位のシフトになります。これは、符号なしの数値を2の累乗で除算するのに最適です(これはシナリオです)。

右論理シフト

いくつかの優れた説明は、ウィキペディアのビット演算に関するものです。

于 2012-08-30T22:28:55.467 に答える