为了账号安全,请及时绑定邮箱和手机立即绑定

整数除零在哪些平台上触发浮点异常?

整数除零在哪些平台上触发浮点异常?

C++ C
当年话下 2019-10-23 12:39:06
在另一个问题中,有人想知道为什么在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-零报告为浮点异常?
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

还有哪些其他操作系统(或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除以零例外。


我认为您的时间最好花在编译时而不是运行时被零除。


查看完整回答
反对 回复 2019-10-23
  • 3 回答
  • 0 关注
  • 578 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信