簡體   English   中英

整數與浮動除法->誰負責提供結果?

[英]Integer vs floating division -> Who is responsible for providing the result?

我已經使用C ++進行了一段時間的編程,但是突然有一個疑問,想與Stackoverflow社區進行交流。

當一個整數除以另一個整數時,我們都知道結果是一個整數,並且同理,浮點數除以浮點數也是一個浮點數。

但是誰負責提供這個結果呢? 是編譯器指令還是DIV指令?

這取決於您的體系結構是否具有DIV指令。 如果您的體系結構同時具有整數和浮點除法指令,則編譯器將針對代碼指定的情況發出正確的指令。 語言標准指定了類型提升的規則,以及在每種可能的情況下應使用整數還是浮點除法。

如果您只有整數除法指令,或者只有浮點除法指令,則編譯器將內聯某些代碼或生成對數學支持庫的調用以處理除法。 眾所周知,除法指令的速度很慢,因此,大多數編譯器將盡可能地對其進行優化(例如,用shift指令替換,或對編譯時常數的除法結果進行預先計算)。

編譯器將在編譯時根據所使用的變量的類型來決定需要哪種除法形式-最終,將涉及一種或另一種形式的DIV(或FDIV)指令。

硬件除法指令幾乎永遠不會包含整數和浮點之間的轉換。 如果您根本沒有得到除法指令(有時會被除掉,因為除法電路又大又復雜),那么實際上可以確定它們是“將int除以int,產生int”和“將浮點除以float,產生浮點”。 。 通常情況下,輸入和輸出的大小也都相同。

在這些原語的基礎上,編譯器負責構建在源代碼中編寫的任何操作。 例如,在C語言中,如果將浮點數除以int,則編譯器將發出從int到float的轉換,然后是浮點數除法。

(確實存在古怪的異常。我不知道,但是我不會把它放在VAX之上,而不必使用“除以int划分浮點數”類型的指令。Itanium並沒有除法指令,但是它的“除法助手” “ 用於浮點,您必須在浮點除法的基礎上偽造整數除法!)

C ++標准中最重要的規則之一是“好像”規則:

本國際標准中的語義描述定義了參數化的不確定性抽象機器。 本國際標准對一致性實現的結構沒有要求。 特別是,它們不需要復制或模擬抽象機的結構。 相反,需要遵循的實現來(僅)模擬抽象機的可觀察行為,如下所述。

與您的問題有關的是什么意思,除法是什么,只要完成就可以。 它可能由DIV機器代碼執行,如果沒有針對所討論處理器的適當指令,則可能由更復雜的代碼執行。

它還可以:

  1. 如果合適的話,用移位操作代替該操作,並且可能更快。
  2. 如果可以在編譯時將其替換為文字,則將其替換;如果在處理x / y時可以將其替換,則可以在編譯時顯示y始終為1。
  3. 如果可以在編譯時將其顯示為始終被零除的整數,請將該操作替換為異常拋出。

您的問題真的沒有道理。 DIV指令本身不會執行任何操作 無論您大聲喊叫,即使嘗試賄賂,它也不承擔任何責任

當使用編程語言[X]進行編程時,[X]編譯器將獨自負責制作符合您在源代碼中描述的功能的程序

如果請求除法,編譯器將決定如何進行除法。 如果您要定位的CPU有一個,則可能會通過為DIV指令生成操作碼來實現。 可能是通過在編譯時預先計算除法,然后將結果直接插入程序中(假設兩個操作數在編譯時都是已知的),也可能是通過生成一系列指令共同模擬除法來完成的。

但這始終取決於編譯器。 除非根據C ++標准對其進行解釋,否則您的C ++程序沒有任何作用。 如果您將其解釋為純文本文件,則不會執行任何操作 如果您的編譯器將其解釋為Java程序,則它將阻塞並拒絕它。

而且DIV指令對C ++標准一無所知。 另一方面, 編寫 C ++編譯器的唯一目的是理解C ++標准並根據該標准轉換代碼。

編譯器始終負責。

幾乎

C99標准定義“當整數相除時,/運算符的結果為代數商,其中不包括任何小數部分。” 並在腳注中加上“這通常被稱為'向零截斷'。”

歷史

從歷史上看,語言規范是負責任的。

Pascal 定義了其運算符,以便使用/進行除法運算始終返回real (即使您使用它除以2的整數),並且如果要除以整數並獲取整數結果,則可以使用div運算符。 (Visual Basic具有類似的區別,並使用\\運算符進行整數除法,以返回整數結果。)

在C語言中,如果需要浮點結果,則決定通過將整數操作數之一轉換為float來進行相同的區分。 對待整數類型和浮點類型的約定已經成為您在許多C衍生語言中進行描述的方式。 我懷疑該約定可能起源於Fortran。

暫無
暫無

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

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