数字除以零是硬件异常 我在C++特殊处理中已经知道,除以0的数字是一个硬件异常。有人能解释为什么它被称为硬件异常吗?因为,如果它被选中,那么它就会被硬件选中并引发。具体来说,CPU的算术逻辑单元(ALU)将检查0作为除法器,并生成适当的中断以发出异常信号

数字除以零是硬件异常 我在C++特殊处理中已经知道,除以0的数字是一个硬件异常。有人能解释为什么它被称为硬件异常吗?因为,如果它被选中,那么它就会被硬件选中并引发。具体来说,CPU的算术逻辑单元(ALU)将检查0作为除法器,并生成适当的中断以发出异常信号,c++,c,exception,assembly,divide-by-zero,C++,C,Exception,Assembly,Divide By Zero,否则,您必须在汇编程序源代码中明确检查0 编辑:注意,这仅适用于整数除法,因为浮点除法有特定的状态,将信号除以零。,因为它在C++意义上不是例外。通常,在C++世界中,我们使用“硬件陷阱”这个词来避免任何歧义,但是也可以使用“硬件异常”。基本上,硬件会触发一些东西,使您进入操作系统 并不是所有系统都会为除以0生成硬件陷阱。我曾经做过这样一件事,结果得到了最大的可能值,并继续进行。这是一个硬件异常,因为它是由CPU检测到的 c/c++或任何其他语言中的代码将转换为CPU命令,然后由CPU执行。因此

否则,您必须在汇编程序源代码中明确检查0


<>编辑:注意,这仅适用于整数除法,因为浮点除法有特定的状态,将信号除以零。

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


并不是所有系统都会为除以0生成硬件陷阱。我曾经做过这样一件事,结果得到了最大的可能值,并继续进行。

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


c/c++或任何其他语言中的代码将转换为CPU命令,然后由CPU执行。因此,只有CPU可以发现你被零除

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

7.1.4如果在表达式评估期间,结果未在数学上定义或不在其类型的可表示值范围内,行为未定义。[注:用零除法处理,使用零除数形成余数,所有浮点异常因机器而异,有时可通过库函数进行调整。。-结束注

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

不管怎样,即使被称为“硬件异常”,它也与C++代码中的C++异常无关。 例如,在Intel上,除以零将导致CPU自动在堆栈上保存最少的寄存器,然后调用其地址必须事先放置在特定内存地址中的函数


是由OS/可执行文件来选择/重写一些有用的行为,尽管一些C++编译器确实支持拦截这些事件和生成C++异常,但它不是C++标准提到的一个特性,也不是广泛的移植。一般的期望是,您将编写一个一致检查的类。,或在可能失败的分区之前执行特殊检查。

是否出现异常取决于您的处理器。定点和浮点也不同或可以不同。要符合浮点规范的要求,Device by zero同时具有异常和非异常解决方案。如果fpu已禁用该异常,则你会得到“正确签名的无穷大”,否则你会得到一个异常,结果是一个nan或类似的东西,我手头没有规范

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


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

,并且只有当它一个浮点除法不会引起相同的行为。@ PMF浮点是由FPU处理的,不是由ALU处理的。无论如何,我将添加一个指针。除C 0和C++之外,乌布的C长20长,如果有人怀疑这是C++ C++的新的。是的,UB并不意味着“保证故障”。.某些CPU没有整数除法的例外情况,例如ARM.有一个例子。(在本例中是有符号溢出,而不是0除法。)