!合同式による計算機内部の整数演算(加算器、減算器)
DEF cong(x)=MOD(x,m^N) !合同式 x'≡x (mod m^N)
SUB disp(x) !表記する PRINT USING "########": x; !10進法 PRINT " (";right$(REPEAT$(" ",N-1)&BSTR$(x,2),N);")"; !Nビット符号なし2進法 PRINT " #";BSTR$(x,16) !16進法 END SUB
LET m=2 !進法 LET N=8 !桁数 ※8ビット -128〜127
LET a=12 LET b=-3
PRINT "入力された値 ※10進法" PRINT "a=";a PRINT "b=";b PRINT
!---------- ↓↓↓↓↓ ---------- PRINT "計算機内部の値(";m;"の補数) ※レジスタ、メモリ" LET aa=cong(a) !N桁符号あり整数へ !!!IF a<0 THEN LET aa=a+m^N ELSE LET aa=a !N桁符号あり整数へ LET bb=cong(b) PRINT "a="; CALL disp(aa) PRINT "b="; CALL disp(bb) PRINT
PRINT "加算 ※ALU、アキュームレータ" PRINT USING " ########": aa PRINT USING "+########": bb PRINT "-----------"
PRINT USING " ########": aa+bb !最上位桁の桁上りを考慮した計算
LET acc=cong(aa+bb) !最上位桁の桁上りは無視する PRINT " "; CALL disp(acc) !---------- ↑↑↑↑↑ ----------
PRINT PRINT "出力装置での表示" IF acc>=m^N/2 THEN !負の数なら(MSBが1) LET dat=MOD(acc,-m^N) !N桁符号なし整数へ !!!LET dat=acc-m^N !N桁符号なし整数へ ELSE LET dat=acc !そのまま END IF PRINT dat
PRINT PRINT "検算 a+b=";a+b
END
|