integer, parameter :: m = -2147483648
导致编译器错误:“整数太大了”,但
integer, parameter :: m = -2147483647 - 1
似乎工作并产生正确的结果。我认为这是因为编译器在取消它之前检查2147483648并溢出整数类型。虽然减法1 hack似乎可以进行所需的初始化,但是有一种“最佳实践”方法可供使用吗?
答案 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位整数,允许您使用更大的数字。