Fortran 带print语句的整数输出格式
我注意到,如果我使用Fortran 带print语句的整数输出格式,fortran,Fortran,我注意到,如果我使用integer(16)变量,当我使用print时,输出包含预期的确切空格数。因此,当我使用时(有些人可能会在这里认识到一个项目euler问题) 我明白了 The difference is 25164150 作为输出,但是当我对变量使用integer(8)或integer时,我得到 The difference is 25164150 作为输出。无论是否带有-m64标志,这种情况都会发生,并且仅在gfortran上发生(我的ifort似乎不接受ki
integer(16)
变量,当我使用print
时,输出包含预期的确切空格数。因此,当我使用时(有些人可能会在这里认识到一个项目euler问题)
我明白了
The difference is 25164150
作为输出,但是当我对变量使用integer(8)
或integer
时,我得到
The difference is 25164150
作为输出。无论是否带有-m64
标志,这种情况都会发生,并且仅在gfortran上发生(我的ifort似乎不接受kind=16
,这是一个需要处理的单独问题,但会返回带有整数(8)
空格的输出)
有人知道为什么会发生这种情况吗?之所以会发生这种情况,是因为您对输出使用默认格式
print*
相当于write(unit=*,fmt=*)
,其中fmt=*
表示对输出使用默认格式,这可能取决于编译器。默认格式使用输出的数据类型可能需要的空间,而无需根据值进行调整
考虑以下代码:
integer(kind=4) :: a ! short integer for my compiler
integer(kind=8) :: b ! long integer for my compiler
a = 23
b = huge(a)
print*,a ! small value, short integer, we expect spaces
print*,huge(a) ! maximum value, short integer, we expect no spaces
print*,huge(b) ! maximum value, long integer, we expect no spaces
print*,b ! medium lenght value, long integer, we expect spaces
end
使用gfortran编译时,输出为:
23
2147483647
9223372036854775807
2147483647
第一行是一个4字节整数表示的小数字。请注意要填充到最大可能大小的空间。第二行是4字节整数可以接受的最大值。在输出中紧密配合,没有空格。第三行是8字节整数的最大值。很合身。第四行与第二行的值相同,但采用8字节整数表示。注意空格
这就回答了为什么在输出中获得空格作为默认格式。它不能完全回答您的问题,这就是为什么四精度整数的输出中没有空格。我不知道。我的编译器(
pgf90 10.6-0
,ifort 12.0.2.137
,gfortran 4.5.1
)都不支持四精度整数。可能是编译器黑客。有人可能对这一部分有更多的经验,希望他们能参与进来。如前所述,您使用的是列表定向IO,虽然很方便,但语言标准并没有完全规定。所以你会发现自己的特质。如果要控制输出,则需要使用一种格式。格式说明符“I0”也很方便,它使用输出项所需的最小位数
作为一个附带问题,“整数(N)”不能保证是N字节整数。它与“整数*N”不同,后者不是语言标准的一部分。许多编译器使用类型的字节数作为种类值,但也有例外。事后看来,使用整数值来指定整数、实数和逻辑子类型是一个错误。如果要按字节数选择类型,可以使用从Fortran 2003开始的方法。Fortran 2003的ISO_C_绑定模块提供类型指示符,如C_INT32_T、C_INT64_T和C_INT128_T。Fortran 2008的ISO_Fortran_ENV模块提供INT8、INT16、INT32和INT64。列表定向输出是特定于处理器的(注意Fortran标准调用“处理器”,我们通常称之为“编译器”)。以下是Fortran 90标准关于列表定向输出的说明: 10.8.2列出定向输出 整数输出常量由
Iw
编辑描述符产生
实际常数是由
F
编辑描述符或E
编辑描述符产生的,具体取决于值的大小x
,以及范围10d1。我使用的格式标准是write(*,*)
,但我只是想知道print
,因为我一直在使用它解决我所做的所有项目euler问题。在另一个问题上,gfortran(版本4.6.3)中是否提供了那些Fortran 2003/2008方法?I0
说明符正是我所需要的!
23
2147483647
9223372036854775807
2147483647
! Note the space in the string
PRINT '("The difference is ",I0)', diff