0

私は1つのint型と1つのuint型を持っています:

int tempA = 0xbc000669;
uint tempB = 0xbc000669;

私がする時

tempA /0x2000、13だけ右にシフトしたい場合、それは私に与えます0xfffde001

その間

tempB / 0x2000、右に 13 シフトしたい場合、正しい答えが得られます。0x0005e000

署名された除算で、なぜ間違った答えが得られるのか誰にもわかりませんか? 分割がオーバーフローするとは思わなかったのですか?ありがとう

4

4 に答える 4

4

声明では

tempA / 0x2000

コンパイラは、int 型の変数と数値リテラル値を認識します。int 型の除算には int 型の 2 つのオペランドが必要なため、値 0x2000 も自動的に int にキャストされます。ステートメントは次のように評価されます

(int)0xbc000669 / (int)0x2000

これは -1140849047 / 8192 で、-139263 に等しい

16 進数の -139263 は FFFDE001 です (少なくとも 32 ビット値では)

于 2013-09-25T18:44:34.143 に答える
1

0xbc000669実際には に含めることはできませんint。より正確には を表しますnegative integer。が をとしてint使用することはわかっています。whileは最も重要なニブルを持ち、これは->であり、実際の整数は負です。そう:32nd bitsign bit0cbc0006690xb101132nd bit1

int tempA = 0xbc000669;

tempA等しくなります。-1140849047この数値を 13 桁の 2 進数で右シフトすると、次の正確な結果が返されます0xfffde001

次のように宣言しtempBた場合uint

uint tempB = 0xbc000669;

を符号ビットとして使用しないuintため、完全に a に含めることができます。実際の数値は aで、その値は です。この値を 13 桁の 2 進数で右シフトすると、次のような正確な結果が得られます。uint32nd bitpositive integer31541182490x5e000

于 2013-09-25T20:53:26.493 に答える
0

整数除算に関する仕様の宣伝文から:

除算は結果をゼロに向けて丸め、結果の絶対値は、2 つのオペランドの商の絶対値より小さい可能な最大の整数です。2 つのオペランドの符号が同じ場合、結果はゼロまたは正になり、2 つのオペランドの符号が反対の場合、結果はゼロまたは負になります。

そのテキストを正しく解釈すると、次のようになります。最初の例では、signed int 値に符号ビットが設定されています。2 番目の数値 (0x2000) は正であるため、結果はゼロまたは負になります。

于 2013-09-25T18:39:51.967 に答える
0

これを説明する最良の方法は、ビットがどのように機能するかを示すことです。 署名付き数値表現に関するウィキペディアの記事は、それをよくカバーしています。2 の補数のセクションを読みたいと思うでしょう。

私が思うに、人々は -1 の符号ビットが 1 であることを除いて、-1 と 1 のバイナリが同じであることを望んでいると思います。これはそうではありません。たとえば、1 は

0000 0000 0000 0000 0000 0000 0000 0001

そして -1 は

1111 1111 1111 1111 1111 1111 1111 1111

人々が直観的に考える -1 は、実際には -127 です。

-127 == 1000 0000 0000 0000 0000 0000 0000 0001

それでは、あなたが得た答えを見てみましょう。符号付き除算では、右にシフトすると、実際には数値の左側に 1 をパディングして 1 を追加することになります。まさにそれが結果に表示されます。

0xFFFDE001 = 1111 1111 1111 1101 1110 0000 0000 0001
0x0005E000 = 0000 0000 0000 0101 1110 0000 0000 0000

お気づきのように、どちらも同じですが、一番上のもの (署名された部門からのもの) の左側には 13 個の 1 が埋め込まれており、最後に 1 が追加されています。

符号付き整数について覚えておくべき重要なことは、2 の補数によってビットの順序が変わるため、符号ビットを除いて、-50 は +50 と同じビット パターンを持たないということです。

于 2013-09-25T19:03:39.140 に答える