愤怒的三炮 发表于 2023-8-30 23:35:00

数值溢出显示负数

integer:: fp
fp = 800000*24240
print*, fp
end
编译器默认是4字节的整型,但800000*24240明显是溢出了这个范围,编译器并没有报错,而是输出了一个负数: -2082836480

这是什么原因呢?

-- Windows gcc 8.1.0

Transpose 发表于 2023-8-31 07:58:06

结果超过了2**31-1,溢出了
应该使用integer(8)
program main
implicit none
integer(8):: fp
fp = 800000_8*24240_8
print*, fp
end program

楚香饭 发表于 2023-8-31 08:39:13

通常编译器不会检查 integer 的溢出,而只会检查浮点数的溢出。

800000*24240 = 19392000000 也就是十六进制的 0x483DA7000,超出32位整数的表达范围。
于是会丢弃超出的 0x400000000,剩下 0x83DA7000
而 0x83DA7000 表示成有符号整数,就是 -2082836480

你可以了解一下计算机存储整数的知识,比如 补码 啊什么的
页: [1]
查看完整版本: 数值溢出显示负数