首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数字除以零是硬件异常

数字除以零是硬件异常
EN

Stack Overflow用户
提问于 2014-02-18 19:24:37
回答 5查看 2.1K关注 0票数 4

我在C++异常处理过程中了解到,数字被零除是一个硬件异常。有人能解释一下它为什么叫硬件异常吗?

EN

回答 5

Stack Overflow用户

发布于 2014-02-18 19:29:20

因为它不是C++意义上的例外。通常,在C++世界中,我们使用“硬件陷阱”一词,以避免任何歧义,但也可以使用“硬件异常”。基本上,硬件触发了一些东西,这将导致你登陆操作系统。

并不是所有的系统都会生成一个硬件陷阱来除以0。我曾经在一个例子中工作过,在这个例子中,你得到了最大可能的值,并且一直保持着。

票数 7
EN

Stack Overflow用户

发布于 2014-02-18 19:53:03

C++标准本身认为除以零是未定义的行为,但通常一个实现可以提供实现定义的行为,如果它喜欢的话。

C++20规定:

7.1.4如果在表达式求值期间,结果没有在数学上定义,或者不在其类型的可表示值的范围内,则行为是未定义的。[注:被零除的处理,使用零除数形成余数,以及所有浮点异常随机器的不同而不同,有时可通过库函数调整。- end备注

通常在实践中,您的CPU将检查是否除以零,并且历史上不同的CPU制造商使用了不同的术语来描述导致的CPU行为:一些制造商称其为“中断”,另一些制造商称其为“陷阱”或“信号”,或“异常”,或“故障”,或“中止”。除了硬件和汇编语言术语之外,CPU设计人员并不倾向于关心或避免与任何东西发生冲突。

无论如何,即使被称为“硬件异常”,它也与try/catch意义上的C++异常无关。

例如,在Intel上,被零除将导致CPU自发地在堆栈上保存最少的寄存器,然后调用其地址必须预先放在特定内存地址中的函数。

由操作系统/可执行文件来选择/覆盖一些有用的行为,虽然一些C++编译器确实特别支持拦截这些事件和生成C++异常,但这不是C++标准提到的功能,也不是广泛可移植的功能。通常的期望是,您要么编写一个一致检查的类,要么在可能失败的分区之前执行即席检查。

票数 6
EN

Stack Overflow用户

发布于 2014-02-18 19:31:28

这是一个硬件异常,因为它被CPU检测到。

使用c/c++或任何其他语言编写的代码将转换为CPU命令,然后由CPU执行。所以只有CPU才能找到除以0的结果

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21852270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档