为何gfortran无-fno-range-check选项无法编译64位整数程序?
解决gfortran中int64整数字面量编译报错的替代方案
你遇到的问题根源是:gfortran默认会把十进制整数字面量当作默认整数类型(通常是32位)处理,而9223372036854775807已经超出32位整数的范围,即便你要赋值给int64类型的变量,编译器会先检查字面量本身的类型范围,因此触发报错。
不用-fno-range-check的替代方案有以下几种:
1. 给整数字面量指定int64类型
直接在数字末尾加上_Int64,让编译器把这个字面量识别为int64类型,这样就不会触发32位整数的范围检查:
program big_int use ISO_FORTRAN_ENV integer(kind=int64) :: my_int print *, huge(my_int) my_int = 9223372036854775807_Int64 ! 添加_Int64指定字面量类型 print *, my_int end program big_int
2. 使用huge()函数获取最大值
既然你已经调用huge(my_int)打印了该类型的最大值,直接用这个函数赋值是最稳妥的方式,既不用手动记数值,也不会出现范围问题:
program big_int use ISO_FORTRAN_ENV integer(kind=int64) :: my_int print *, huge(my_int) my_int = huge(my_int) ! 直接用huge()赋值类型最大值 print *, my_int end program big_int
3. 使用十六进制字面量(可选)
如果场景需要,也可以用十六进制表示int64的最大值,同样要指定类型:
my_int = Z'7FFFFFFFFFFFFFFF'_Int64
不过这种方式不如前两种直观,一般不推荐日常使用。
内容的提问来源于stack exchange,提问作者Stef1611
相关产品推荐
相关产品推荐

