数字除以零是硬件例外



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

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

并不是所有的系统都会生成一个除以0的硬件陷阱。我已经研究过一个结果是你得到了尽可能大的价值,并一直坚持下去

C++标准本身认为除以零是未定义的行为,但通常情况下,如果愿意,实现可以提供实现定义的行为

C++20规定:

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

通常在实践中,您的CPU会检查是否被零除,历史上不同的CPU制造商对所产生的CPU行为使用了不同的术语:有些称之为"中断",有些称其为"陷阱"、"信号"、"异常"、"故障"或"中止"。除了硬件和汇编语言术语之外,CPU设计者往往不关心或避免与任何东西发生冲突。。。。

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

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

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

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

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

是否出现异常取决于您的处理器。定点和浮点也不同或可以不同。浮点规范为了符合要求,有一个例外和非例外的零偏差解决方案。如果fpu禁用了这个异常,那么你会得到"正确签名的无穷大",否则你会得到一个异常,结果是一个nan或类似的东西,我手头没有规范。

如果某个特定处理器有一个除法,那么程序员的参考手册应该有希望讨论不动点除以零的行为。如果不是,则它是一个软除法,然后由编译器库决定它的作用(例如,调用除以零的处理程序)。

它通常被称为硬件异常,因为硬件正在检测问题,并且硬件会因此做一些事情。当您遇到其他问题时也是如此,如mmu访问故障、数据中止、预取中止等。硬件异常,因为它是由硬件处理的异常,通常。。。

因为,如果它被选中,那么它就会被硬件选中并引发。具体来说,CPU的算术逻辑单元(ALU)将检查0作为除法器,并生成适当的中断来发出异常信号。

否则,您将不得不在汇编程序源代码中明确检查0。

编辑:请注意,这只适用于整数除法,因为浮点除法有特定的状态来表示除以零。

最新更新