関連する質問に対するこの回答には、加算による減算を行う方法を示す C のサンプル コードがあります。このコードは、キャリー フラグとオーバーフロー フラグも設定し、いくつかの数値を加算および減算して結果を出力する単純な「テスト」を含んでいます。数値は 8 ビットです。
編集:符号なし整数にSUBの代わりに ADD を使用し、SUBからのように符号なしオーバーフロー/アンダーフローを検出できるという正式な証明。
ここa - bで、aとbは 4 ビットの符号なし整数であり、加算によって減算を実行し、a < b のときに 4 ビットの差とアンダーフロー/オーバーフローの指標を取得したいとします。
a - b = a + (-b)
モジュロ 16 演算で操作しているため、-b= 16-b. したがって、
a - b = a + (-b) = a + (16 - b)
通常の符号なし加算を実行するaと16-b、この加算のオーバーフロー条件 (CPU のcarryフラグで示されることが多い) は次のようになります (4 ビット整数を扱っていることを思い出してください)。
a + (16 - b) > 15
このオーバーフロー条件を単純化しましょう:
a + 16 - b > 15
a + 16 > 15 + b
a + 1 > b
a > b - 1
整数を扱っていることを思い出してください。したがって、上記は
a >= b のように書き換えることができます。と を加算し
てキャリーフラグ=1になる条件です。不等式が成り立たない場合は、キャリー = 0 になります。a(16)-b
ここで、減算 (a - b) からのオーバーフロー/アンダーフローに関心があったことを思い出してください。その条件はa < bです。
まあ、a >= bはa < bの正反対です。
このことから、加算によってcarry得られるフラグは、減算オーバーフローの逆、つまり、適切な減算命令 (例: SUB) を使用して直接減算することによって得られるフラグの逆であるということになります。a(16)-bborrowba
キャリーを逆にするか、逆に扱うだけです。