初始化值为-2 ** 31的整数

时间:2012-09-07 21:01:27

标签: fortran

integer, parameter :: m = -2147483648

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

integer, parameter :: m = -2147483647 - 1

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

至于最佳做法,我见过的INT_MIN的每个定义都以-INT_MAX - 1表示:

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

答案 2 :(得分:0)

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