我注意到如果我使用integer(16)变量,当我使用时print,输出包含预期的确切空格数.因此,当我使用时(有些人可能会认识到项目的euler问题)
implicit none
integer(16)::sum_sq,sq_sum,diff,i
sum_sq=0;sq_sum=0;
do i=1,100
sum_sq=sum_sq+i*i
sq_sum=sq_sum+i
enddo
diff=abs(sq_sum**2-sum_sq)
print *, "The difference is", diff
Run Code Online (Sandbox Code Playgroud)
我明白了
The difference is 25164150
Run Code Online (Sandbox Code Playgroud)
作为输出,但当我使用integer(8)或integer为变量,我得到
The difference is 25164150
Run Code Online (Sandbox Code Playgroud)
作为输出.这种情况发生在有和没有-m64标志的情况下,只有在gfortran上(我的ifort似乎不接受kind=16,一个单独的问题要处理,但返回带有空格的输出integer(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
Run Code Online (Sandbox Code Playgroud)
使用gfortran编译时,输出为:
23
2147483647
9223372036854775807
2147483647
Run Code Online (Sandbox Code Playgroud)
第一行是4字节整数表示中的小数字.注意填充最大可能大小的空格.第二行是4字节整数可以采用的最大值.紧密贴合输出,没有空格.第三行是8字节整数的最大值.紧紧贴合.第四行是第二行的相同值,但是以8字节整数表示.注意空格.
这就解释了为什么在输出中获得默认格式的空格.它并没有完全回答你的问题,这就是为什么四元精度整数的输出中没有空格的原因.我不知道.无论是我的编译器(的pgf90 10.6-0,ifort 12.0.2.137,gfortran 4.5.1)支持四精度整数.可能是编译器hackery.有人可能对这部分有更多的经验,并希望他们会参与其中.
正如已经回答的那样,您正在使用列表导向的IO,虽然方便,但语言标准并未完全指定.所以你会发现特质.如果要控制输出则需要使用格式.同样方便的是格式说明符"I0",它使用输出项目所需的最小位数.
作为附带问题,"整数(N)"不保证是N字节整数.它与"整数*N"不同,后者不是语言标准的一部分.许多编译器使用类型值来表示该类型的字节数,但也有例外.事后看来,使用整数值来指定整数,实数和逻辑子类型是错误的.如果要按字节数选择类型,则有从Fortran 2003开始的方法.Fortran 2003的ISO_C_Binding模块提供类型指示符,如C_INT32_T,C_INT64_T和C_INT128_T.Fortran 2008的ISO_FORTRAN_ENV模块提供INT8,INT16,INT32和INT64.