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的答案)。