誰かが9と-10の後に2の補完をどのようにしてくれたか教えてください。 9
バイナリ値のため2と9の減算はどのようにして行われますか?
= 10
バイナリ値のため1001
=
1010
は-10ために2の補数を取る= 0110
9 = 1001
と-10を= 0110
それが最後に1111
ています。 = 15
しかし答えは-1
誰かが9と-10の後に2の補完をどのようにしてくれたか教えてください。 9
バイナリ値のため2と9の減算はどのようにして行われますか?
= 10
バイナリ値のため1001
=
1010
は-10ために2の補数を取る= 0110
9 = 1001
と-10を= 0110
それが最後に1111
ています。 = 15
しかし答えは-1
短い答えが-10の2の補数に4ビット符号付き整数で表されることができない来ます。オーバーフローが発生する - 0110
の符号ビットが0であることに注意してください。 (同じことが9の場合も同様です - 符号ビットが1であることに注意してください)。
実際には、これを手動で行う場合、入力を処理するのに十分な大きさのバッファを割り当てる必要があります出力)。あなたが例えば8ビットを使用している場合、何が起こっているか明確にする必要があります:
00001001
00001010
の2の補数= 11110101
+ 00000001
= 11110110
00001001
+ 11110110
= 11111111
=あなたがOを無視した場合とされていることを今、-1、数学の背後にある論理はまだ動いています:
1111
は4ビット符号付き整数では15ではありません。 符号ビット(最上位ビット)は1であり、それが負であることを示す1です。したがって、2の補数の負数、この場合は-1と解釈する必要があります。 1111
は、4ビットの符号なし整数、ならびに(実際に00...01111
よく、符号ビットが0であることになる)より大きなサイズの符号付き整数の15であることを
注意。
全体として符号なしと同じ数字を解釈すると、数学は依然として機能します。
1001
+ 0110
= 1111
9
+ -10
(したがって、2の補数の美しさです!)= -1
9
+ 6
= 15
署名付き-7
+ 6
= -1
したがって、あなたが全体の動作/プログラムを通して署名さらしに一致している必要不可欠です。 ステートメント "9 = 1001および-10 = 0110最終的には1111 = 15"になります。符号なしの解釈(-103 = 0110
) - 符号なしのもの(1111
= 15) 、これによりエラーが発生します。
結果が正しくない主な理由は、4ビットの数値では-8〜7の数字しか表現できないためです。9と-10を2の補数で書きたい場合、5ビット01001
と10110
となります)。
次に、01001
+ 10110
== -1。
'10110 'が来たらどうすればいいのですか – user306128
-10と同じように' 0110 'になります: 10 =' 01010' => -10 = '10101' +' 1' = '10110' ちょうど通常は2の補数の場合と同様に1を反転して1を加算します。 – Akko
ありがとうございました。 – user306128
問題の解決に役立つ場合は[回答を受け入れてください](http://meta.stackexchange.com/a/5235/155831)してください。 [あなたのプロフィールにリストされている]質問の残りの部分(http://stackoverflow.com/users/4101535/user306128)を見直して、それらの回答が正しいかどうかを確認してください。それは誰にでも役立ちます。 –