亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

整數除零在哪些平臺上觸發浮點異常?

整數除零在哪些平臺上觸發浮點異常?

C++ C
慕運維8079593 2019-11-04 10:31:50
在另一個問題中,有人想知道為什么在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 回答

?
呼如林

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除以零例外。


我認為您的時間最好花在編譯時而不是運行時被零除。


查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 821 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號