1. ホーム
  2. math

[解決済み] 大きな符号なし2進数から小さな2進数の引き算

2022-02-12 15:54:19

質問

コンピュータの構成とアセンブリ言語のコースを受講しています。 今週の研究室の筆記試験で、ある質問があり、困っています。 問題の内容は...

次の符号なし2進数を引き算しなさい(ボロービットとオーバーフロービットを表示すること)。 2の補数には変換しないでください。

 0101 0111 1101
-1110 1011 0110
 --------------

という答えが返ってきたと実感しています。 -1001 0011 1001 しかし、この引き算を実際に行うために、大きい方の数字を取って小さい方の数字から引き、自分の仕事を示すために、どのように借りればいいのかがわからず、困っています。 私のこれまでの人生では、小さな数から大きな数を引くときは、問題を逆にして、代わりに大きな数から小さな数を引き、結果の前に負の符号を付けてきました。 教授に尋ねると、この問題は書かれたとおりに解いてほしいと言うのです。 私はこの問題を、通常のように大きい数から小さい数を引いて否定して解くことは許されないのです。 ネットで調べても、大きい符号なし2進数から小さい符号なし2進数を引く例題は見つかりませんでした。

このシナリオで引き算を実行する方法について、どなたか説明していただけると本当にありがたいです。

更新しました。 アレックスの言うとおりです。 教授が探していたのは

0110 1100 0111 (1735)

皆さん、ありがとうございました。

解決方法は?

どの数字が大きく、どの数字が小さいかに関係なく、同じ方法で行います。

 bb b      bb   <- borrows
 0101 0111 1101 (1405)
-1110 1011 0110 (3766)
 --------------
 0110 1100 0111 (1735?)

さて、適切な差分を求める場合、上記の結果には符号ビットが含まれていないので、オーバーフローを考慮する必要があります。

 b bb b      bb   <- borrows
 0 0101 0111 1101 (1405)
-0 1110 1011 0110 (3766)
 ----------------
 1 0110 1100 0111 (-2361 signed 2's complement)

本当に、CPUは何から何を引かれるかなんて気にしないんです。整数の足し算・引き算には同じアルゴリズムが使われていて、しかもこのアルゴリズムは符号付き整数でも符号なし整数でも同じです。結果とキャリーフラグ、オーバーフローフラグを正しく解釈すればいいのです。それだけだ。