数值溢出显示负数
integer:: fpfp = 800000*24240
print*, fp
end
编译器默认是4字节的整型,但800000*24240明显是溢出了这个范围,编译器并没有报错,而是输出了一个负数: -2082836480
这是什么原因呢?
-- Windows gcc 8.1.0
结果超过了2**31-1,溢出了
应该使用integer(8)
program main
implicit none
integer(8):: fp
fp = 800000_8*24240_8
print*, fp
end program 通常编译器不会检查 integer 的溢出,而只会检查浮点数的溢出。
800000*24240 = 19392000000 也就是十六进制的 0x483DA7000,超出32位整数的表达范围。
于是会丢弃超出的 0x400000000,剩下 0x83DA7000
而 0x83DA7000 表示成有符号整数,就是 -2082836480
你可以了解一下计算机存储整数的知识,比如 补码 啊什么的
页:
[1]