我刚刚在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
输出为
Selected Integer Kind 15:
9223372036854775807
-1
9223372036854775807
编译器不应该根据int()的参数自动选择正确的返回类型吗?这种意外行为让我花费了大约2500小时的计算时间:(
文档说明(第{9}页的http://nf.nci.org.au/facilities/software/intel_fortran_reference.pdf):
Argument Type Result Type
INTEGER(1), INTEGER(2), INTEGER(4) INTEGER(4)
INTEGER(1), INTEGER(2), INTEGER(4), INTEGER(8) INTEGER(8)
根据此表,Integer(8)作为参数应该给出Integer(8)作为结果类型,但输出给出-1。对我来说看起来像个错误,但是在我离开之前,我希望得到第二双眼睛并且知道开发人员。标准中是否有我忽略的要求-1作为返回值?
答案 0 :(得分:5)
没有。该表是错误的或误导性的(多行,否则没有意义,可能反映出某些兼容性选项的行为变化,但如果是这样,我不知道它是什么选项)。在标准Fortran中,INT泛型内在函数的结果类型仅取决于KIND参数的存在和值。如果KIND参数不存在则结果具有默认整数种类,否则KIND参数指定结果的KIND。
在没有更改默认整数类型的编译选项的情况下,示例程序中第二次调用INT的参数值无法用该编译器的默认整数表示。您的代码不符合规定。
虽然文本没有实质性改变(除了可能变得更加混乱),但我注意到您链接到的文档很古老。