4
integer, parameter :: m = -2147483648

导致编译器错误:“Integer too big for its kind”,但是

integer, parameter :: m = -2147483647 - 1

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

4

3 回答 3

5

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

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

于 2012-09-08T07:09:21.923 回答
1

正如您所怀疑的,编译器将 -2147483648 解释为值 +2147483648 的一元否定,并且该中间值对于带符号的 32 位整数来说太大了。

至于最佳实践,INT_MIN我见过的每个定义都用以下方式表示-INT_MAX - 1

我的结论是,最好的做法是依靠编译器的常量折叠来做正确的事情,而不是直接表达这个常量。

于 2012-09-07T21:53:52.490 回答
0

2147483648 不存在,32 位最大为 2147483647。您需要使用整数*8 变量,它是一个 64 位整数,可让您使用更大的数字。

于 2012-09-07T21:09:47.663 回答