Fortran Coder

标题: 数值溢出显示负数 [打印本页]

作者: 愤怒的三炮    时间: 2023-8-30 23:35
标题: 数值溢出显示负数
[Fortran] 纯文本查看 复制代码
integer:: fp
fp = 800000*24240
print*, fp
end

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

这是什么原因呢?

-- Windows gcc 8.1.0

作者: Transpose    时间: 2023-8-31 07:58
结果超过了2**31-1,溢出了
应该使用integer(8)
[Fortran] 纯文本查看 复制代码
program main
implicit none
integer(8):: fp
fp = 800000_8*24240_8
print*, fp
end program

作者: 楚香饭    时间: 2023-8-31 08:39
通常编译器不会检查 integer 的溢出,而只会检查浮点数的溢出。

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

你可以了解一下计算机存储整数的知识,比如 补码 啊什么的




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2