我在C ++异常处理期间学到了数除以零是一个硬件异常。任何人都可以解释为什么它被称为硬件异常
答案 0 :(得分:6)
因为它不是C ++意义上的例外。通常,在C ++世界中,我们使用“硬件陷阱”一词来避免任何歧义,但也可以使用“硬件异常”。基本上,硬件会触发一些会导致您进入操作系统的东西。
并非所有系统都会生成一个除以0的硬件陷阱。我已经开始研究一个你得到最大可能值的结果,并继续使用。
答案 1 :(得分:4)
您的CPU将检查除以零,并且历史上不同的CPU制造商使用不同的术语来表示导致的CPU行为:一些称为“中断”,另一些称为“陷阱”,“信号”或“异常” “,或”错误“或”中止“。 CPU设计人员不会关心 - 或者避免冲突 - 除了硬件和汇编语言之外的任何东西....
在Intel上,例如,除以零将导致CPU自发地在堆栈上保存最少的寄存器,然后调用其地址必须事先放在特定存储器地址中的函数。
由OS /可执行文件选择/覆盖一些有用的行为,虽然一些C ++编译器专门支持拦截这些事件和生成C ++异常,但它不是C ++标准提到的功能,也不是广泛的可移植性。一般的期望是,您要么编写一个一致检查的类,要么在可能失败的分区之前执行临时检查。
答案 2 :(得分:3)
这是一个硬件异常,因为它是由CPU检测到的。
您使用c / c ++或任何其他语言编写的代码将转换为CPU命令,然后由CPU执行。所以只有CPU才能发现你除以零
答案 3 :(得分:1)
如果您获得例外,这取决于您的处理器。固定点和浮点也不同或可以。要符合要求的浮点规范具有异常和非异常解决方案,以便为零。如果fpu禁用了该异常,那么你将获得“正确签名的无穷大”,否则你会得到一个异常,结果是一个nan或类似的东西,我没有这个规范。
如果处理器完全没有分隔,程序员参考特定处理器的手册应该有希望讨论固定点除零行为。如果不是那么它是一个软分割然后由编译器库决定它的作用(例如,调用除零处理程序)。
它通常被称为硬件异常,因为硬件正在检测问题,因此硬件会做一些事情。当你遇到其他问题时,例如mmu访问错误,数据中止,预取中止等硬件异常都是一样的,因为它是由硬件处理的异常,通常......
答案 4 :(得分:0)
因为,如果选中它,则由硬件检查并引发它。具体来说,CPU的算术逻辑单元(ALU)将检查0作为分频器并生成适当的中断来发出异常信号。
否则,您必须在汇编程序源代码中明确检查0。
编辑:请注意,这仅适用于整数除法,因为浮点除法具有特定的状态来表示除数为零。