2016-06-22 14 views
0

誰かが9と-10の後に2の補完をどのようにしてくれたか教えてください。 9バイナリ値のため2と9の減算はどのようにして行われますか?

= 10バイナリ値のため1001
=

1010は-10ために2の補数を取る= 0110

9 = 1001と-10を= 0110それが最後に1111ています。 = 15

しかし答えは-1

答えて

3

短い答えが-10の2の補数に4ビット符号付き整数で表されることができない来ます。オーバーフローが発生する - 0110の符号ビットが0であることに注意してください。 (同じことが9の場合も同様です - 符号ビットが1であることに注意してください)。

実際には、これを手動で行う場合、入力を処理するのに十分な大きさのバッファを割り当てる必要があります出力)。あなたが例えば8ビットを使用している場合、何が起こっているか明確にする必要があります:

  • 9 = 00001001
  • -10 = 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) 、これによりエラーが発生します。

+0

ありがとうございました。 – user306128

+0

問題の解決に役立つ場合は[回答を受け入れてください](http://meta.stackexchange.com/a/5235/155831)してください。 [あなたのプロフィールにリストされている]質問の残りの部分(http://stackoverflow.com/users/4101535/user306128)を見直して、それらの回答が正しいかどうかを確認してください。それは誰にでも役立ちます。 –

2

結果が正しくない主な理由は、4ビットの数値では-8〜7の数字しか表現できないためです。9と-10を2の補数で書きたい場合、5ビット0100110110となります)。

次に、01001 + 10110 =​​= -1。

+0

'10110 'が来たらどうすればいいのですか – user306128

+0

-10と同じように' 0110 'になります: 10 =' 01010' => -10 = '10101' +' 1' = '10110' ちょうど通常は2の補数の場合と同様に1を反転して1を加算します。 – Akko

関連する問題