如何设置 Fortran 整数种类

How to set Fortran Integer kind

program PEU3
integer(kind=7) :: num = 600851475143
integer(kind=7) :: pf, counter 

这是我的 Fortran 代码的一部分。 Num 非常大,所以我试图将它设置为 kind = 7,但出于某种原因它仍然抛出错误 217 - Integer(Kind=3) Constant out of range,对于声明 num 的行,即使我已经声明了num 应该是 kind 7。我已经用了一段时间了,我终究无法理解为什么它不起作用。将非常 提供帮助。我的 IDE 是柏拉图,带有 silverfrost 编译器,如果相关的话。

注意错误是“Constant 超出范围”,而不是“Variable 超出范围”。行中的常量

integer(kind=7) :: num = 600851475143

是实际数字:600851475143。默认情况下,您的编译器似乎希望将常量存储为 32 位整数,而这个数字对于它来说太大了。

最简单的解决方案是告诉编译器将该常量存储为与 num 相同类型的常量,因此请遵循以下原则:

integer(kind=7) :: num = 600851475143_7

结尾的下划线告诉编译器将常量存储为类型 7 的整数。

但是

我需要指出,什么数字对应于哪种类型取决于编译器和机器。这意味着代码不会轻易转移。

所以请使用以下结构之一:

对于较新的编译器(兼容 Fortran 2008),使用内部 iso_fortran_env 模块:

program PEU3
    use iso_fortran_env, only: int64
    implicit none
    integer(kind=int64) :: num = 600851475143_int64

对于较旧的编译器,您可以使用 selected_int_kind 方法找出最佳整数类型。它只有一个参数:要存储的最大(以 10 为底的)数字数。 (虽然从技术上讲,如果您将数字 12 传递给它,它只会保证 -10^12 ... 10^12 之间的数字,因此您必须传递 13 才能确定您的数字可以存储。)

integer, parameter :: largeint = selected_int_kind(13)
integer(kind=largeint) :: num = 600851475143_largeint

这两种方法都更易于阅读且独立于编译器,因此更容易移植到新系统。