2012-07-30 105 views
3

當c有/運營商劃分兩個號碼時,具有div() library function的目的是什麼?div()庫函數的用途是什麼?

是否有任何情況下/不能使用,但div()可以嗎?

+2

http://stackoverflow.com/questions/11694546/divide-a-number-by-3-without-using-operators – 2012-07-30 16:46:36

+1

@StephenCanon你的意思是div()已經被用來處理這些問題嗎? – Eight 2012-07-30 16:50:02

+0

不,'div()'提出了荒謬的面試問題。這是一個笑話。這就是說,這將是這個問題的一個很好的答案。 – 2012-07-30 16:50:42

回答

12

從C99理由文件:

(7.20.6.2的DIV,LDIV和lldiv功能)因爲C89已經有符號整數的除法實現定義語義時負的操作數參與,股利和LDIV ,和C99中的lldiv,是爲了給有符號整數除法和餘數運算提供精心指定的語義。語義採用與Fortran相同。由於這些函數同時返回商和餘數,因此它們也可以作爲高效建模底層硬件的便捷方式,從而將兩個結果作爲同一操作的一部分進行計算。 [...] 既然C99需要類似的除法運算符的語義,新的 程序使用div,ldiv或lldiv的主要原因是要同時獲得商和餘數。

+0

我沒有意識到這一點。太糟糕了,他們沒有提供另外一個用於「餘數」> = 0的更有用的行爲。根據我的經驗,當你真正在意n/d是如何被舍入爲n時,在幾乎所有這些情況下,你都希望它朝向-inf(這也使得%成爲一個適當的模數)。呃,好吧。 – greggo 2015-06-16 17:05:28

2

div_t是一個結構,它包含商成員餘數成員。例如:

typedef struct { 
    int quot; 
    int rem; 
} div_t; 

div功能使用/%運營商的一些簡單的實施方式。您還可以看到this topic

2

div()返回分區remainderresult。因此,您不必使用%運算符來查找remainder

1

正如其他人所提到的,div()會給你 商和餘數。這是因爲大多數C運行時使用的(軟件)整數 除法算法在相同的 時間計算兩者。

如果目標計算機沒有硬件除法器,該/ 操作通常被變成了一個電話div()和 其餘被扔掉。 % 運算符也會發生同樣的情況,只不過它是被投擲的商。所以,如果你 做這樣的事情:

quot = a/b; 
rem = a % b; 

你兩次調用除法例程(和除法是相當緩慢的,如果 您的電腦沒有硬件做)。所以使用 div()可以更快地獲得兩者。

(當然,它也是不易閱讀,你是否真正獲得任何 性能優勢取決於你的特定平臺和編譯器。 你應該永遠只能切換到div()如果你確定這是 性能瓶頸。記住Knuth關於過早的 優化。)