我在C++异常处理过程中了解到,数字被零除是一个硬件异常。有人能解释一下它为什么叫硬件异常吗?
发布于 2014-02-18 19:29:20
因为它不是C++意义上的例外。通常,在C++世界中,我们使用“硬件陷阱”一词,以避免任何歧义,但也可以使用“硬件异常”。基本上,硬件触发了一些东西,这将导致你登陆操作系统。
并不是所有的系统都会生成一个硬件陷阱来除以0。我曾经在一个例子中工作过,在这个例子中,你得到了最大可能的值,并且一直保持着。
发布于 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++标准提到的功能,也不是广泛可移植的功能。通常的期望是,您要么编写一个一致检查的类,要么在可能失败的分区之前执行即席检查。
发布于 2014-02-18 19:31:28
这是一个硬件异常,因为它被CPU检测到。
使用c/c++或任何其他语言编写的代码将转换为CPU命令,然后由CPU执行。所以只有CPU才能找到除以0的结果
https://stackoverflow.com/questions/21852270
复制相似问题