Fortran Coder

查看: 1486|回复: 2

[数值问题] 数值溢出显示负数

[复制链接]

37

帖子

11

主题

0

精华

专家

F 币
369 元
贡献
141 点
发表于 2023-8-30 23:35:00 | 显示全部楼层 |阅读模式
[Fortran] 纯文本查看 复制代码
integer:: fp
fp = 800000*24240
print*, fp
end

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

这是什么原因呢?

-- Windows gcc 8.1.0

164

帖子

2

主题

1

精华

大师

Vim

F 币
981 元
贡献
478 点

规矩勋章

发表于 2023-8-31 07:58:06 | 显示全部楼层
结果超过了2**31-1,溢出了
应该使用integer(8)
[Fortran] 纯文本查看 复制代码
program main
implicit none
integer(8):: fp
fp = 800000_8*24240_8
print*, fp
end program

718

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
631 元
贡献
323 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

发表于 2023-8-31 08:39:13 | 显示全部楼层
通常编译器不会检查 integer 的溢出,而只会检查浮点数的溢出。

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

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

评分

参与人数 1F 币 +10 贡献 +10 收起 理由
愤怒的三炮 + 10 + 10 教科书级别~

查看全部评分

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-7-21 08:33

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表