我正在尝试学习Fortran,看到了许多不同的定义,不知道它们是不是在尝试完成同样的事情。以下三者之间有什么区别?
integer*4
integer(4)
integer(kind=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
(或选择的任何名称)的parameter
后,您可以在整个代码中使用它作为符号。这还使更改精度变得容易。
请求8或9个十进制数字通常会获取一个4字节的整数。
integer*4
是一种常见的扩展,追溯到旧版FORTRAN,用于指定4字节整数。虽然这种语法不是标准的Fortran,也从未是。
integer(4)
或integer(RegInt_K)
是integer(kind=4)
或integer(kind=RegInt_K)
的简写。 integer(4)
不同于integer*4
,而且不可移植--语言标准没有指定种类的数值。大多数编译器将使用kind=4
来表示4字节整数--对于这些编译器,integer*4
和integer(4)
将提供相同的整数类型--但也有例外情况,因此最好避免使用integer(4)
。
实数的方法类似。
更新:如果您不想按所需精度指定数值类型,而是按其存储使用的空间指定类型,Fortran 2008提供了一种方法。在use
ISO_FORTRAN_ENV模块后,可以通过存储位数指定实数和整数类型。例如,对于4字节(32位)整数:
use ISO_FORTRAN_ENV
integer (int32) :: MyInt
再解释一下“类型”的含义。编译器有一张不同数字类型的表格。所有整数类型都是基本类型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的规范。
要查看如何设置kind数字的正确选项,请参见M.S.B.的答案。
相同的概念也适用于real
数据类型。请参见Fortran 90 kind parameter (mataap的答案)。
integer*n
或real*n
中显示的语法是很久以前编译器提供的常见扩展,当不同的计算机体系结构开始对整数和实数值的内存格式有不同设计时,n
是存储的值的字节大小。然而,这并没有说明这些值的范围或精度:例如,不同的16位整数实现可能提供不同的范围和限制值。寄存器的大小可以是8、12、16、30、32、36、48、60或64位,一些CDC机器具有补码整数(允许整数为负零!),PDP-11系列具有几种不同的浮点格式,IBM 360/370的浮点采用了“十六进制规范化”等等[...] 这些扩展非常受欢迎,以至于许多程序员认为(甚至今天仍然有很多人认为)这种语法是标准的Fortran;但事实并非如此!
iso_fortran_env
内置模块,该模块具有用于查询编译器实现的类型的存储大小的函数,例如numeric_storage_size
和bit_size
。Fortran 2003修订版的另一个新增功能是iso_c_binding
内置模块,它提供了与C类型在存储、精度和范围上兼容的kind参数值。
内置模块ISO_C_BINDING声明了与C类型可互操作的Fortran类型的常量,例如C_FLOAT和C_INT。如果您要声明与C可互操作的变量和接口,请使用这些常量。
iso_fortran_env
,包括命名常量int8
、int16
、int32
、int64
、real32
、real64
和real128
,它们的值对应于占据指定位数的整数和实数类型。需要注意的是,这些常量只能保证存储大小,并不能保证精度或范围。只有在确切需要这样的情况下才使用它们。