Fortran:整数* 4与整数(4)与整数(种类= 4)

我试图学习Fortran,我看到很多不同的定义被传递,我想知道他们是否试图完成同样的事情。 以下是什么区别?

  • integer*4
  • integer(4)
  • integer(kind=4)

在Fortran> = 90中,最好的方法是使用内部函数来指定所需的精度 – 这保证了可移植性,并保证了所需的精度。 例如,要获取将支持至少8位十进制数字的整数i和my_int,可以使用:

 integer, parameter :: RegInt_K = selected_int_kind (8) integer (kind=RegInt_K) :: i, my_int 

将“RegInt_K”(或者您选择的任何名称)定义为参数后,您可以在整个代码中将其用作符号。 这也很容易改变精度。

请求8或9位十进制数字通常会得到一个4字节的整数。

整数* 4是回到旧的FORTRAN指定一个4字节整数的普通扩展。

整数(4)或整数(RegInt_K)是整数(种类= 4)或整数(种类= RegInt_K)的简写。 整数(4)与整数* 4不同,不可移植 – 语言标准没有指定种类的数值。 大多数编译器对于4字节整数使用kind = 4,对于这些编译器,integer * 4和integer(4)将提供相同的整数类型 – 但也有例外,因此整数(4)是不可移植的并且最好避免。

实际的做法是相似的。

更新:如果您不想按要求的精度指定数字类型,而是按照它们将使用的存储来指定数字类型,那么Fortran 2008提供了一种方法。 可以通过use ISO_FORTRAN_ENV模块后的存储位数来指定实数和整数,例如对于一个4字节(32位)整数:

 use ISO_FORTRAN_ENV integer (int32) :: MyInt 

gfortran手册在“内部模块”下有文档。

只是一个更明确的解释是什么样的。 编译器有一个不同数值类型的表。 所有的整数类型都是不同的基本类型 – integer 。 假设编译器有1个字节,2个字节,4个字节,8个字节和16个字节的integer (或real )类型。 在表中,编译器有一个这样的索引 – 这个索引是类型数字。

许多编译器选择这个编号:

 kind number number of bytes 1 1 2 2 4 4 8 8 16 16 

但是他们可以选择其他编号。 其中一个明显的可能性是

 kind number number of bytes 1 1 2 2 3 4 4 8 5 16 

确实有编译器(至少g77和NAG)选择这种方法。 也有选项可以改变这一点。 因此, kind数不是可移植的integer(kind=4)integer(4)是指根据编译器的4字节整数或8字节整数。

integer*4是可移植的,因此总是意味着4个字节。 但另一方面,它不是可移植的,因为它从来不是任何标准的一部分。 使用此表示法的程序无效Fortran 77,90或任何其他Fortran。

要看到正确的选项如何设置种类数字,请参阅MSB的答案。

相同的概念适用于real数据类型。 参见Fortran 90类参数 (mataap的答案)。