Fortran Coder

查看: 1837|回复: 2
打印 上一主题 下一主题

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

[复制链接]

43

帖子

13

主题

0

精华

专家

F 币
436 元
贡献
155 点
跳转到指定楼层
楼主
发表于 2023-8-30 23:35:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
integer:: fp
fp = 800000*24240
print*, fp
end

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

这是什么原因呢?

-- Windows gcc 8.1.0
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

168

帖子

2

主题

1

精华

大师

Vim

F 币
1021 元
贡献
486 点

规矩勋章

沙发
发表于 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

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

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

板凳
发表于 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-12-23 17:25

Powered by Tencent X3.4

© 2013-2024 Tencent

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