簡體   English   中英

數除以零是硬件異常

[英]number divide by zero is hardware exception

我在 C++ 異常處理期間了解到數字除以零是硬件異常。 任何人都可以解釋為什么它被稱為硬件異常

因為它不是 C++ 意義上的例外。 通常,在 C++ 世界中,我們使用“硬件陷阱”一詞來避免歧義,但也可以使用“硬件異常”。 基本上,硬件會觸發一些會導致您登陸操作系統的事情。

並不是所有的系統都會產生除以 0 的硬件陷阱。我已經研究過一個結果,你只是得到了最大的可能值,然后繼續下去。

C++ 標准本身認為除以零是Undefined Behavior ,但像往常一樣,一個實現可以提供實現定義的行為,如果它喜歡的話。

C++20規定:

7.1.4 如果在對表達式求值期間,結果未在數學上定義或不在其類型的可表示值范圍內,則行為未定義 [注意:被零除的處理,使用零除數形成余數,所有浮點異常因機器而異有時可以通過庫函數進行調整。-尾注

通常在實踐中,您的 CPU 將檢查除以零,並且歷史上不同的 CPU 制造商對導致的 CPU 行為使用了不同的術語:有些稱之為“中斷”,其他稱之為“陷阱”或“信號”,或“異常”、“故障”或“中止”。 除了硬件和匯編語言術語之外,CPU 設計人員不傾向於關心或避免與之發生沖突。

無論如何,即使稱為“硬件異常”,也與try / catch意義上的 C++ 異常無關。

例如,在 Intel 上,除以零將導致 CPU 自發地在堆棧上保存最少的寄存器,然后調用其地址必須事先放置在特定內存地址中的函數。

由操作系統/可執行文件選擇/覆蓋一些有用的行為,雖然一些 C++ 編譯器確實特別支持攔截這些事件和生成 C++ 異常,但它不是 C++ 標准提到的功能,也不是廣泛可移植的。 一般的期望是您要么編寫一個始終檢查的類,要么在可能失敗的划分之前執行臨時檢查。

這是一個硬件異常,因為它被 CPU 檢測到。

您在 c/c++ 或任何其他語言中的代碼被轉換為 CPU 命令,然后由 CPU 執行。 所以只有 CPU 才能找出你除以零

如果您遇到異常,這取決於您的處理器。 定點和浮點也不同或可以。 為了符合要求,浮點規范具有除以零的異常和非異常解決方案。 如果 fpu 禁用了該異常,那么您將獲得“正確簽名的無窮大”,否則您將獲得一個異常,結果是 nan 或類似的東西,我沒有手頭的規范。

如果處理器有除法,則特定處理器的程序員參考手冊應該有希望討論定點除以零的行為。 如果不是,則它是軟除法,然后由編譯器庫決定它的作用(例如調用除以零處理程序)。

它通常被稱為硬件異常,因為硬件正在檢測問題,因此硬件會執行某些操作。 當您遇到其他問題(例如 mmu 訪問錯誤、數據中止、預取中止等)時也是如此。硬件異常,因為它是由硬件處理的異常,通常......

因為,如果它被選中,那么它就會被硬件選中並引發。 具體來說,CPU 的算術邏輯單元 (ALU) 將檢查 0 作為分頻器並生成適當的中斷以發出異常信號。

否則,您必須在匯編源代碼中明確檢查 0。

編輯:請注意,這僅適用於整數除法,因為浮點除法具有特定狀態來表示除以零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM