【问题标题】:Strange behavior of "gfortran -Wconversion"“gfortran -Wconversion”的奇怪行为
【发布时间】:2026-02-09 11:40:01
【问题描述】:

考虑下面的代码。

! test.f90

program test
    use iso_fortran_env, only: INT64, REAL64
    print *, real(0_INT64, REAL64)
    print *, real(1000_INT64, REAL64)
    print *, real(huge(0_INT64), REAL64)      
end program test

当用gfortran按如下方式编译时:

$ gfortran -Wconversion -std=f2008 test.f90

我收到以下警告:

test.f90:5:18:

    5 |     print *, real(huge(0_INT64), REAL64)
      |                  1
Warning: Change of value in conversion from ‘INTEGER(8)’ to ‘REAL(8)’ at (1) [-Wconversion]

请注意,gfortran 对前两次转化很满意,但对最后一次转化不满意。

问题:上述警告是gfortran 的预期行为吗?我认为在这三种情况下都不应该产生任何警告,因为转换是由REAL( , INT64)明确完成的。

这里是我gfortran的版本信息:

$ gfortran --version

GNU Fortran (Ubuntu 9.3.0-10ubuntu2) 9.3.0

作为参考,ifort19.1.127 编译 test.f90 没有任何抱怨:

$ ifort -warn all -stand f08 test.f90

非常感谢任何 cmets 或评论家。

【问题讨论】:

  • 0 和 1000 可以在 REAL64 中精确表示(甚至在 REAL32 中)。 HUGE(INT64) 是 9223372036854775807,它不能。 REAL64 有 53 位用于“尾数”(实际上是有效位),减去符号并添加隐藏位后,它支持不到 16 位十进制数字。 9223372036854775807 是 19 位十进制数字。这不是标准要求的诊断,因此取决于每个“处理器”(编译器)如何处理它。
  • 我明白了。非常清楚。我只考虑范围,但忘记计算小数位数。非常感谢! @dave_thompson_085

标签: fortran gfortran intel-fortran fortran2008


【解决方案1】:

@dave_thompson_085 在 cmets 中回答:

“0 和 1000 可以在 REAL64 中精确表示(甚至在 REAL32 中)。 HUGE(INT64) 是 9223372036854775807,它不能。 REAL64 有 53 位用于“尾数”(实际上是有效位),在减去符号并添加隐藏位之后,它支持不到 16 位十进制数字。 9223372036854775807 是 19 位十进制数字。这不是标准要求的诊断,因此取决于每个“处理器”(编译器)如何处理。”

非常感谢@dave_thompson_085。

【讨论】:

  • 您是否也会在 fortran@gcc.gnu.org 列表寻求帮助时发送后续消息?