再探再报 除 0 这件事有不同

首先,在数学中,一个数除以0是没有意义的。

其次,在计算机中,对于除零,传统概念里是会上报一个异常。首先是CPU内部实现会报异常。最早学组成原理和汇编的时候,都是说CPU寄存器中有个表示除零异常的位。在Linux系统中,除零也会出现异常。为了简单期间,我们从应用层来看。

如果代码里直接出现除零,编译器是会报警告的:

当然,我们可以规避这一点,将常量0换成一个表达式。这时候欺骗过了编译器,执行时会上报浮点异常:

不过这样做的前提是整型数。浮点数由于内部表示的差异,可能不会出现真正的除零(即使写直接写0.0,结果也是无穷 inf)。这里就不再展开说明了。

不过最近,博主遇到了一件奇怪的事,在review代码的时候,发现了除零的情况,但是实际运行时,并没有上报异常,当然执行结果也是不对的。

不过博主是在ARM平台上调试的,难道这跟x86有不同?后来实验了一下,本质上二种平台是一致的。ARM中也会提供处理异常的向量,操作系统注册后,遇到处理,就会进入异常处理,类似中断处理的过程。这其实是操作系统底层的处理方法。而博主实测的环境又有所不同,主要是没有使用操作系统,跑的是裸机程序。可是转念一想,也不对啊,即使是裸机方式,也是使用了CPU厂家提供的BSP,其中对异常是有定义的。为了摸清这个问题,不得已再上汇编,看看到底执行指令的情况是啥样的,省得想的头疼。

不看不知道,一看吓一跳。汇编代码里,对除零做了特殊处理,如下图:

汇编后的代码逻辑变成了这样:首先判断除数是否为零,如果是零,就跳到新的位置进行处理。在新的位置,判断被除数与零的大小,如果大于,则将0x80000000取反返回,否则,将其返回。大概意思是,如果被除数大于零,返回最大正数,当前32位系统,就是2,147,483,647,否则,返回最小负数,当前32位系统,就是-2,147,483,648。

有了上面的汇编作支撑,程序没有报异常,也就可以很好的理解了。

从这个例子,还有之前博主测试发现关于堆栈的增长反向的例子(实践出真知--你的字节对齐和堆栈认知可能是错误的_gdb查看字节对齐-CSDN博客),可以看出,计算机领域,很多工程结论是有前提条件的,尤其是在语言、编译器、操作系统、CPU平台存在多种选择的情况下。如果实际工程中遇到了奇怪的问题,并且怀疑是一些基础概念的话,可以做个简单验证,加以快速排除疑惑。这其中的关键就是要意识到很多东西是依赖语言本身特性、编译器实现、操作系统处理方法、CPU支持情况来综合决定的。这也是为啥标准统一显得重要的原因了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/526761.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上位机图像处理和嵌入式模块部署(qmacvisual二维码识别)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 如果说条形码在商品上使用比较多的话,那么二维码识别是一个更加使用频繁的场合。为什么使用这样频繁,我想很多一部分原因来…

渗透测试——信息收集

信息收集 前言 信息收集是在做渗透时找尽可能的多的信息,为之后的渗透做铺垫。信息收集的方法有很多 比如,页面、真实的IP、域名/子域名、敏感目录/文件、端口探测、CMS指纹识别、操作系统识别 1. 页面信息收集 拿到域名后,从网站的url中…

Bee Mobile组件库重磅升级

Bee Mobile组件库重磅升级! 丰富强大的组件移动预览快速上手create-bee-mobile Bee Mobile组件库重磅升级! Bee Mobile组件库最新 v1.0.0 版本,支持最新的 React v18。 主页:Bee Mobile 丰富强大的组件 一共拥有50多个组件&…

基于javaweb+springboot开发的城市地名地址信息管理系统设计和实现

基于javaweb(springboot)城市地名地址信息管理系统设计和实现 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言…

一切都在变好

(1)规模复杂性Hold不住了 我已经说过多次,有几个: 1、5400多只股票,还会再持续增加 2、2.2亿账户,每年还以1600万在增加 3、60-90万亿市值 4、每天6000亿-万亿交易额,看趋势还在增加 也就是说&a…

时间序列-AR MA ARIMA

一、AR模型(自回归) AR探索趋势和周期性 预测依赖于过去的观测值和模型中的参数。模型的阶数 p pp 决定了需要考虑多少个过去时间点的观测值。 求AR模型的阶数 p和参数 ϕ i \phi_i ϕi​ ,常常会使用统计方法如最小二乘法、信息准则(如AIC、BIC&#xf…

开源的Java图片处理库介绍

在 Java 生态系统中,有几个流行的开源库可以用于图片处理。这些库提供了丰富的功能,如图像缩放、裁剪、颜色调整、格式转换等。以下是几个常用的 Java 图片处理库的介绍,包括它们的核心类、主要作用和应用场景,以及一些简单的例子…

加密流量分类torch实践4:TrafficClassificationPandemonium项目更新

加密流量分类torch实践4:TrafficClassificationPandemonium项目更新 更新日志 3/10号更新 流量预处理更新 增加了基于splitCap.exe分流预处理,并且除了提取负载与包长序列后,支持提取统计特征(26维度)。 26维度统计…

表单进阶(3)-上传文件和隐藏字段

上传文件&#xff1a;<input type"file"> 隐藏字段&#xff1a;<input type"hidden" name"" id"" value"带给后端的信息"> 禁用disabled&#xff1a;<button disabled"disabled">注册</bu…

UDP与TCP:了解这两种网络协议的不同之处

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

微信小程序-侧滑删除

简介 movable-view和movable-area是可移动的视图容器&#xff0c;在页面中可以拖拽滑动。 本篇文章将会通过该容器实现一个常用的拖拽按钮功能。 使用效果 代码实现 side-view.wtml 布局见下面代码&#xff0c;left view为内容区域&#xff0c;right view为操作按钮&a…

虚函数与纯虚函数有什么区别?

总的来说有两点区别&#xff1a; 1.虚函数的作用主要是矫正指针&#xff08;口语化的说法&#xff09; 2.虚函数不一定要重新定义&#xff0c;纯虚函数一定要定义&#xff08;口语化的说法&#xff09; 1&#xff09;. 虚函数的作用主要是矫正指针&#xff0c;使得基类的指针…