用值 -2**31 初始化整数

Wil*_*ell 4 fortran

integer, parameter :: m = -2147483648
Run Code Online (Sandbox Code Playgroud)

导致编译器错误:“整数太大了”,但是

integer, parameter :: m = -2147483647 - 1
Run Code Online (Sandbox Code Playgroud)

似乎工作并产生正确的结果。我认为这是因为编译器在否定它之前检查 2147483648 并溢出整数类型。虽然减 1 hack 似乎可以进行所需的初始化,但是否有“最佳实践”方法可供使用?

jan*_*neb 5

问题在于 Fortran 标准根据具有对称间隔的“模型编号”定义整数。GFortran(您似乎根据错误消息使用它)不允许不是 Fortran 型号的整数文字,即使二进制补码硬件可以表示这样的数字。此检查是在解析阶段完成的,因此当诸如“-huge(0) - 1”之类的表达式在编译过程中稍后折叠时不会出现错误消息。

使用 GFortran,您可以使用 -fno-range-check 禁用此检查。