3 回答

TA贡献1798条经验 获得超3个赞
还有哪些其他操作系统(或C / C ++运行时,如果您是操作系统)将整数div-by-零报告为浮点异常?
答案取决于您是在内核空间还是用户空间。如果您在内核空间中,则可以将“ i / 0”放在中kernel_main(),让中断处理程序调用异常处理程序并暂停内核。如果您在用户空间中,答案取决于您的操作系统和编译器设置。
AMD64硬件将整数除以零指定为中断0,这与中断16(x87浮点异常)和中断19(SIMD浮点异常)不同。
“被零除”例外是用div指令除以零。关于x87 FPU的讨论不在此问题范围内。
其他硬件具有类似的不同中断(例如,PPC在float-div-by-zero上引发0x7000,并且根本不捕获int / 0)。
更具体地说,00700映射到异常类型“程序”,其中包括启用了浮点的异常。如果尝试使用浮点指令将其除零,则会引发此类异常。
另一方面,按照PPC PEM,整数除法是未定义的行为:
8-53潜水
如果尝试执行除法-0x8000_0000÷–1或÷0,则rD的内容以及CR0字段的LT,GT和EQ位的内容均未定义(如果Rc = 1,则未定义) )。在这种情况下,如果OE = 1,则设置OV。
我们的应用程序使用_controlfp_s内在函数(最终为stmxcsr op)对除零的浮点异常进行屏蔽,然后捕获它们以进行调试。因此,我在实践中肯定看到过IEEE754除以零例外。
我认为您的时间最好花在编译时而不是运行时被零除。
- 3 回答
- 0 关注
- 800 浏览
添加回答
举报