我正在处理大于2 ^ 31-1的整数,所以我试图将整数变量的精度设置为更高的值。我认为正确的方法是
PROGRAM f1
IMPLICIT NONE
INTEGER,PARAMETER :: LONG = SELECTED_INT_KIND(15)
INTEGER(KIND=LONG) :: n
n=2**31
END PROGRAM f1
据我所知,应该允许n
在[-10 ^ 15,10 ^ 15]。但是,上面的代码使用gfortran 4.6抛出编译器错误,即
n=2**31
1
Error: Arithmetic overflow at (1)
我尝试用n=int8(2**31)
替换麻烦线,但无济于事。有什么建议吗?
答案 0 :(得分:2)
这是this recent question的近乎重复,所以我应该投票结束,但又来了,
在表达式2**31
中,2
和31
都是默认整数,很可能是32位整数。在将结果赋给n
之前,编译器将根据32位整数的规则将它们相乘,然后溢出。如果这不是你想要的行为,要么摆弄编译器选项(不好推荐),要么明确设置文字值的种类(更好):
n = 2_long**31_long
(实际上,您不需要同时制作2
和31
long
个整数,但这不会造成任何伤害。)