fortran66のブログ

fortran について書きます。

Fortran90入門 負の整数 二の補数表現

階乗の計算。

PROGRAM factorial
IMPLICIT NONE
INTEGER :: i, ifac
ifac = 1
DO i = 1, 20
 ifac = ifac * i
 PRINT *, i, '!=', ifac
END DO
STOP
END PROGRAM FACTORIAL

実行結果

途中までは正しい結果を出しますが、13!から先は結果が狂っています。あまつさえ負の数まで出ています。これは何故でしょうか?

この問いは、教育的効果が大きいFortran入門の練習問題としてよく使われます。


これは整数の桁あふれ(Overflow)がおこったためです*1

ここで0または正の2進法の表し方は知っているものとします。またコンピュータ内部では数が2進法で表されているというのは知っていると思います。

現在*2一般に使われている32bitコンピュータでは、4byte=32bit=32桁の2進数が処理単位になっています。この場合正の2進数ならば0から(11111111 11111111 11111111 11111111)_2=2^{32}-1=4,294,967,295\simeq 4\times10^{9}までの整数を表せることになります。


では負の整数はコンピュータ内部において2進法でどのように表されているのしょうか。
(続く)

*1:整数の桁あふれは一般に検出されず、実行時エラーになりません。ただし処理系によってはオプションで検出できることもあります。

*2:平成20年