数字除以零是硬件异常

Iqb*_*der 3 c c++ assembly

我在C++异常处理期间学到了数除以零是一个硬件异常.任何人都可以解释为什么它被称为硬件异常

Jam*_*nze 6

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

并不是所有的系统都会生成一个硬件陷阱,除以0.我已经开始研究一个你得到最大可能值的结果,然后继续使用.


Ton*_*roy 6

C++ 标准本身认为除以零是Undefined Behavior,但像往常一样,如果它喜欢,实现可以提供实现定义的行为

C++20规定:

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

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

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

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

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