竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS 2の補数の加減算におけるオーバーフローの生成

<<   作成日時 : 2014/04/20 07:43   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0


 2の補数によるオーバーフローの解説、演算結果が表現できる範囲外になると発生するというのはあるけれども演算器側の立場でオーバーフローを生成するというのが見つからないので表を作って考えた。

算術オーバーフロー(Wikipedia)

 オーバーフローは、演算結果が範囲内に入らない時に発生する。2の補数による加減算では以下のとおり。

・(Aが正の数)+(Bが正の数)→結果が負の数
・(Aが負の数)+(Bが負の数→結果が正の数
・(Aが正の数)ー(Bが負の数)→結果が負の数
・(Aが負の数)ー(Bが正の数)→結果が正の数

 ここでは3bit(-4〜+3)で考える。

画像


 A+B、A-Bの加減算を同じ表にした。

・表の青色の部分は加算の時のみオーバーフロー
・減算は範囲内になるのでオーバーフローは起こらない
・A-BはA+(Bの2の補数)してから加算と異なる
・Bの2の補数を取る操作(NEG B)で負の最大数の場合、符号を反転するとオーバーフローするが、減算命令では発生しない


 x86の機械語で確認してみた。

0x80+0x80 -> overflow
http://ideone.com/bd3RZt

0x80-0x80 -> ok
http://ideone.com/GA8Qq0

NEG 0x80 -> overflow
http://ideone.com/TBjfYp


AのMSBをAn、BのMSBをBn、結果CのMSBをCnとすると、

加算の場合のオーバーフロー
・(An xor Cn) and (Bn xor Cn)

減算の場合のオーバーフロー
Bの2の補数のオーバーフローをBvとすると
・((An xor Cn) and (Bn xor Cn)) xor Bv

となるはず。


 SPARCではどうか。OpenSPARCのソースを調べていたのだがノートPCにジュースをこぼしてしまって修復中なのでここはあとで。

メモ:

sparc_exu_ecl.v

assign adder_xcc[1] = (alu_ecl_adder_out_63_e) ? (~byp_ecl_rs1_63_e & ~alu_ecl_adderin2_63_e & sel_sum_e):
(byp_ecl_rs1_63_e & alu_ecl_adderin2_63_e & sel_sum_e);
assign adder_icc[1] = (alu_ecl_adder_out_31_e) ? ((~byp_ecl_rs1_31_e & ~alu_ecl_adderin2_31_e | tag_overflow)
& sel_sum_e):
((byp_ecl_rs1_31_e & alu_ecl_adderin2_31_e | tag_overflow)
& sel_sum_e);




その他、2の補数のオーバーフローについて調べたもの:

・マイコンピュータNo.6 徹底特集完全理解6809のすべて p.52には2の補数のオーバーフローを桁上りで解説している。符号なし演算で最上位ビットからあふれるのをC、最上位ビットに桁上りするのをNとして考えるとよい。

2進数と2の補数
ALUのオーバーフローフラグの生成条件の証明などの問題(OKwave)

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




2の補数の加減算におけるオーバーフローの生成 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる