在另一个问题中,有人想知道为什么在C ++程序中实际上有一个整数被零除的情况,为什么会出现“浮点错误”。围绕此展开了讨论,有人断言,对于浮点数除以零,实际上从未提出过浮点异常,而仅在整数除以零时才出现。
这对我来说听起来很奇怪,因为我知道:
在所有Windows平台上的x86和x64上,由MSVC编译的代码将整数除以零表示为“ 0xc0000094:整数除以零”,将浮点除以零为0xC000008E“浮点除以零”(启用时)
IA-32和AMD64 ISA将#DE(整数除法异常)指定为中断0。浮点异常触发中断16(x87浮点)或中断19(SIMD浮点)。
其他硬件具有类似的不同中断(例如, PPC在float-div-by-zero上引发0x7000,并且根本不捕获int / 0)。
我们的应用程序使用_controlfp_s内在函数(最终为stmxcsrop)对除零的浮点异常进行屏蔽,然后捕获它们以进行调试。因此,我在实践中肯定看到过IEEE754除以零例外。
因此,我得出结论,有些平台将int异常报告为浮点异常,例如x64 Linux(针对所有算术错误均提高SIGFPE,而与ALU管道无关)。
还有哪些其他操作系统(或C / C ++运行时,如果您是操作系统)将整数div-by-零报告为浮点异常?
慕的地8271018