2015-01-01 67 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 
相关问题