integer, parameter :: m = -2147483648
导致编译器错误:“Integer too big for its kind”,但是
integer, parameter :: m = -2147483647 - 1
似乎工作并产生正确的结果。我认为这是因为编译器在否定它之前检查 2147483648 并溢出整数类型。虽然减 1 hack 似乎可以进行所需的初始化,但是否有“最佳实践”方法可以使用?
integer, parameter :: m = -2147483648
导致编译器错误:“Integer too big for its kind”,但是
integer, parameter :: m = -2147483647 - 1
似乎工作并产生正确的结果。我认为这是因为编译器在否定它之前检查 2147483648 并溢出整数类型。虽然减 1 hack 似乎可以进行所需的初始化,但是否有“最佳实践”方法可以使用?
问题是 Fortran 标准根据“型号”定义整数,它们具有对称间隔。GFortran(您似乎根据错误消息使用)不允许不是 Fortran 型号的整数文字,即使二进制补码硬件可以表示此类数字。这个检查是在解析阶段完成的,因此在编译过程中,当诸如“-huge(0) - 1”之类的表达式被常量折叠时,不会出现错误消息。
使用 GFortran,您可以使用 -fno-range-check 禁用此检查。
2147483648 不存在,32 位最大为 2147483647。您需要使用整数*8 变量,它是一个 64 位整数,可让您使用更大的数字。