fortran66のブログ

fortran について書きます。

2の補数表現では、増加関数として数が増えてゆきますが、ある大きさまで達すると周期境界条件の様に、負の側の絶対値最大の数に飛んでまた増加してゆきます。

ここでは4バイト整数を扱いますので 2^{31}-1 まで増加したところで、-2^{31} へ飛びます。正の最大値と負の最小値の絶対値がずれています。この非対称性がまれに問題になることがあります。

負数は最上位ビットが1になっているので符号ビットとみなすことも出来ます。

PROGRAM int
IMPLICIT NONE
INTEGER :: i, k
DO i = 0, 32
 k = 2 ** i
 PRINT '(i4, i15, 4x, b32.32)', i, k, k
END DO
!
PRINT *
PRINT '(6x, a, 8x, a, 20x, a)', 'INTEGER', 'HEX', 'BINARY'
k =  '1111111111111111111111111111111'B ! 7FFF FFFF
PRINT '(i15, 4x, z8.8, 4x, b32.32)', k, k, k
k = k + 1
PRINT '(i15, 4x, z8.8, 4x, b32.32)', k, k, k
!
PRINT *
k = '11111111111111111111111111111111'B ! FFFF FFFF
PRINT '(i15, 4x, z8.8, 4x, b32.32)', k, k, k
k = k + 1
PRINT '(i15, 4x, z8.8, 4x, b32.32)', k, k, k
STOP
END PROGRAM int