2015-01-01 119 views
1

我正在學習Fortran。我遇到了這個錯誤,但我不知道這個原因。分配最大4字節和8字節整數時出錯

INTEGER*1 :: i1 
INTEGER*2 :: i2 
INTEGER*4 :: i3 
INTEGER*8 :: i4 

i1 = 2**7 - 1 
i2 = 2**15 - 1 

i3 = 2**31 - 1 ! giving error 
i4 = 2**63 - 1 ! giving error 

i4 = 2**31 - 1 ! this also giving error 

即使可變大小支持指定的值,我得到算術流錯誤。

我正在使用gfortran 4.8編譯器。發生什麼事?

+2

2 ** 31是一個算術溢出。你是否嘗試過:i3 = huge(i3) – Rob

+3

不要學習指定變量類型的非標準方式,例如'INTEGER * 4'。學習'kind =','selected_int_kind'(以及它的親屬)以及由標準內在模塊'iso_fortran_env'提供的參數,如'real64'。 –

回答

2

問題是,右側的表達式使用默認文字的大小(可能爲4個字節)來計算,而不管左側變量的類型如何。此外,每個子表達式必須是可計算的,即2**31-1適合4個字節,2**31不適用並且會引發錯誤。

假設你想看到的運算,而不是使用huge() 一種方法是做到這一點:

integer*8 i 
i=2 
i=(i**62-1)*2+1 

integer,parameter::i8=selected_int_kind(18) 
integer(kind=i8) i 
i=(2_i8**62-1)*2+1 
相關問題