Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 带print语句的整数输出格式_Fortran - Fatal编程技术网

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