3

だから私は Randall Hyde の本からアセンブリ言語を学ぼうとしています: The art of assembly language, そして私は最初の章の学習を終え、今私は練習をしようとしています. そして、次の質問があります。バイナリ値(正または負)を反対の符号の16進数値に変換するにはどうすればよいですか。そして、はい、バイナリで0から15までの数値を表す方法と、10がfであることも知っています。 on ...私が抱えている問題は次のとおりです..私はこの番号を与えられています:1001 1001と私はそれを反対の値に変換する必要があります.これまでのところ、2の補数を使用してこれを取得しました:

1001 1001 ----->shifting bits -----> 0110 0110
                add 1         -----> 0110 0111

そして、最初の数値の逆を取得する必要がありました。代わりに、結果の値を計算すると、次のようになります。

1001 1001 = 2^0+2^3+2^4+2^7 = 1+8+16+128 = 153 (which in my opinion is fine...)

数値を変換すると、次のようになります。

0110 0111= 2^0+2^1+2^2+2^5+2^6 = 1+2+4+32+64 = -103

私は何を間違っていますか?

4

2 に答える 2

2

あなたの用語は少しずれています。ビットを「シフト」するのではなく、ビットを反転させたいと考えています(これについては後で学習します)。

何が悪いと思いますか?数の負数は、のようなx別の数です。2つの数字を見て、それらを追加しましょう。yx + y = 0

  1001 1001
+ 0110 0111
-----------
  1111 1112
          ^ oops, 2 should be 10, so record 0 and carry the 1

  1111 1110
+        10 
-----------
  1111 1120
         ^ oops, 2 should be 10, so record 0 and carry the 1

1を持ち続けると、これがどこに到達するかわかりますか?

ここで学ぶべき教訓は、数を解釈するためには、それが符号付きの数であることが意図されているかどうかを知る必要があるということです。符号付き数値であり、符号ビットが設定されている場合、それを人間の出力に変換するには、最初に数値を負にして正になるようにし、負の符号と正の数を出力する必要があります。

于 2012-11-05T15:28:39.453 に答える
0

符号ビットの「値」は -128 です。それがコツです。
(符号なしの値の場合、MSB の値は当然 +128 です)

1001 1001 = -128 + 16+8+1 = -103 --> ビットを反転して絶対値に変換
0110 0110 = 64+32 + 4+2 = 102 (1 を足すと 0110 0111 == 103)

1001 1001 = 128 + 16 + 8 + 1 = 153 (符号なし)。

編集:もう1つのオプション:

|1001 1001| = 256 - (128+16+8+1) = 256-153 = 103

于 2012-11-05T15:28:02.043 に答える