2011-09-17 63 views
5

我不是在問有關定義,而是爲什麼語言創建者選擇在C++中定義具有不對稱行爲的模數。 (我也認爲Java)爲什麼模數在編程語言中定義的方式

假設我想找到大於或等於n的最小數,這個數可以被f整除。

如果n爲正數,那麼我這樣做:

if(n % f) 
    ans = n + f - n % f; 

如果n爲負數:

ans = n - n % f; 

顯然,與正數和負數打交道時,這個定義是不是最有利的。那麼爲什麼它是這樣定義的?它在什麼情況下產生權宜之計?

+0

你在問爲什麼模數對於負操作數沒有固定的定義? –

+0

http://en.wikipedia.org/wiki/Modulo_operation – starblue

+0

澄清:我在問爲什麼定義關於第一個操作數的奇偶性是不對稱的。 –

回答

1

因爲它使用「模2算術」,其中每個二進制數字被獨立處理。看看「師」的例子here

+0

但事實並非如此。計算CRC時使用模2算術,而不是模數算子。 – EJP

1

你錯了。當n爲負值時,只要%/的結果一致,C++允許模運算符的結果爲負值或正值,因此對於任何給定的ab,表達式(a/b)*b + a%b總是會產生a。 C99要求a % b的結果與a的符號相同。某些其他語言(例如Python)要求a % b的符號與b的符號相同。

這意味着您給出的負面表達式n實際上並不需要在C++中工作。當/如果n%f產生一個正數(儘管n是負數),它會給出ans,它小於n

+0

'(a/b)* b + a%b'總是產生'a',除非'b'爲零,那麼行爲是不確定的。 – JohnPS

+1

*「當n爲負值時,... *」更好地說,如果除數或除數爲負,則結果是在C++ 03中定義的實現。但是,大多數C++編譯器遵循C99約定;這可以讓供應商使用C和C++代碼的相同機制。 C++ 11遵循C99約定。它不再是實現定義的。 –

+0

@David:我認爲指出* *操作數被否定爲實現定義的結果 - 但由於他特別提到了'n'是否定的,因此決定最好只討論這一點。就相似性而言,C99比領導者更多是追隨者 - 也就是說,他們對它進行了標準化,因爲基本上所有現代硬件都以這種方式工作。舉一個例子,微軟似乎使用x86'div'指令產生的東西,並且對C99一致性沒有表現出明顯的興趣。 –