我刚刚在ifort(IFORT)15.0.0 2014072中遇到以下内容
program integerkinds
use iso_fortran_env
implicit none
integer(kind=selected_int_kind(15)):: j15
print *,'Selected Integer Kind 15:'
print *, huge(j15)
print *, int(huge(j15))
print *, int(huge(j15),kind=selected_int_kind(15))
end program integerkinds
Run Code Online (Sandbox Code Playgroud)
输出为
Selected Integer Kind 15:
9223372036854775807
-1
9223372036854775807
Run Code Online (Sandbox Code Playgroud)
编译器不应该根据int()的参数自动选择正确的返回类型吗?这种意外的行为只花了我大约2500小时的计算时间在我们的集群上:(
文档说明(http://nf.nci.org.au/facilities/software/intel_fortran_reference.pdf,第9-80页):
Argument Type Result Type
INTEGER(1), INTEGER(2), INTEGER(4) INTEGER(4)
INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8) INTEGER(8)
Run Code Online (Sandbox Code Playgroud)
根据这个表,Integer(8)作为参数应该给出Integer(8)作为结果类型,但输出给出-1.对我来说看起来像个错误,但是在我离开之前,我希望得到第二双眼睛并且知道开发人员.标准中是否有我忽略的要求-1作为返回值在这里?
不.那个表是错误的或误导性的(多行,否则没有意义,可能会反映出某些兼容性选项的行为变化,但如果是这样,我不知道它是什么选项).在标准Fortran中,INT泛型内在函数的结果类型仅取决于KIND参数的存在和值.如果不存在KIND参数,则结果具有默认整数种类,否则KIND参数指定结果的KIND.
在没有更改默认整数类型的编译选项的情况下,示例程序中第二次调用INT的参数值不能用该编译器的默认整数表示.您的代码不符合要求.
虽然文本没有实质性改变(除了可能变得更加混乱),我注意到你链接到的文档是古老的.