什麼是整數除法

整數之間的除法中,使商成為整數的運算。小數部分的處理因語言而異,有向0的方向捨去的(C、Java),也有向較小方向取整的(Python 的 //)。正數之間的結果相同,負數時則不同。

日文名稱: 整数除算

「整數除法」出現在3領域的4道練習題中(電腦算術, C語言基礎, 程式設計基礎(虛擬碼追蹤)等)。

這個名詞所屬的領域: 程式設計基礎(虛擬碼追蹤)

負數時的差異

把 −7 除以 2,在向0捨去的C或Java中,商為 −3、餘數為 −1。在向較小方向取整的Python的 // 中,商為 −4,% 的餘數為 1。兩者都滿足「商 × 除數 + 餘數 = 被除數」,餘數的符號在C中與被除數相同,在Python中與除數相同。把處理負數的程式改寫成其他語言時,這會成為錯誤的原因。

在虛擬碼中的處理

虛擬碼的題目會在題目中說明 ÷ 結果的小數部分如何處理。例如題目寫著「代入整數型變數時捨去小數部分」,那麼把 (lo + hi) ÷ 2 的結果代入整數型的 mid 時,lo + hi 為奇數時的0.5會被捨去。在二分搜尋的中央位置等地方,這個捨去會影響結果。

與移位的關係

除以2的冪次的整數除法,也可以用二進位的右移計算。若為無號整數,x 除以2的商就是 x 右移1位元的值。不過,負數的算術右移是向較小方向取整,因此結果可能與向0捨去不同。

練習整數除法的題目

一般的整數除法器(逐位元求商的恢復型、非恢復型等)比乘法器更容易變慢,其理由下列何者正確?

  1. A因為除法比乘法的計算結果位元數更多
  2. B因為商的每個位元取決於前一個結果,難以平行化
  3. C因為除法的電路只能以浮點數製作
查看答案與解析

正確答案:B. 因為商的每個位元取決於前一個結果,難以平行化

在乘法中,可以同時產生所有的部分積,並以華勒斯樹等平行地相加。另一方面,與直式除法相同方式的除法器,是檢查餘數是否能減去除數來決定商的1個位元,再用其結果的餘數來決定下一個位元,因此每個步驟都取決於前一個結果。所以每個週期只能前進1到數個位元,有時需要數十個週期。也有以牛頓法求倒數再改成乘法的方式。並不是結果的位元數較多。

常見問題

除以0會怎麼樣?

整數除以0在許多語言中是執行時的錯誤(例外),在C語言中則是未定義行為。程式應在除法之前確認除數不是0。

整數除法的商與餘數有什麼關係?

設商為 q、餘數為 r,則被除數 = q × 除數 + r。商與餘數是成對決定的,因此商的取整方式(捨去或向下取整)改變時,餘數也會改變。

解析中的「整數除法」

出現「整數除法」的題目(4題)

  1. 一般的整數除法器(逐位元求商的恢復型、非恢復型等)比乘法器更容易變慢,其理由下列何者正確?
  2. 執行上方含有整數除法的程式碼時的輸出,下列何者正確?
  3. 在C語言中,int型的 −7 / 2 與 −7 >> 1(算術右移的情況)的結果,下列何者組合正確?
  4. ÷ 為除法,代入整數型變數(含引數)時捨去小數部分。以 f(9087) 呼叫下列函式 f 時,回傳值為下列何者?

相關名詞

變數 引數 回傳值 取餘運算 位元運算 物件導向 差一錯誤 追蹤表 陣列 捨入誤差

前往名詞解釋列表