《c陷阱與缺陷》筆記–負數的模數運算

來源:互聯網
上載者:User

本文轉載於:http://blog.sina.com.cn/s/blog_6f5c63ff0100tucb.html

我們知道,在不同的語言中,對負數執行模數運算,結果有可能會是不同的。例如,(-11)%5在python中計算的結果是4,而在C(C99)中計算的結果則是-1。

truncate除法 && floor除法
 在大多數程式設計語言中,如果整數a不是整數b的整數倍數的話,那麼a、b做除法產生的實際結果的小數部分將會被截除,這個過程稱為截尾(truncation)。如果除法的結果是正數的話,那麼一般的程式設計語言都會把結果趨零截尾,也就是說,直接把商的小數部分去除。但是如果除法的結果是負數的話,不同的語言通常採用了兩種不同的截尾方法:一種是趨零截尾(truncate toward zero),另一種是趨負無窮截尾(truncate toward negative infinity);相應的,兩種除法分別被稱為truncate除法和floor除法。
 事實上,可以認為不管除法的結果是正是負,truncate除法都是趨零結尾;而floor除法都是趨負無窮結尾。

模數運算
 模數運算實際上是計算兩數相除以後的餘數。假設q是a、b相除產生的商(quotient),r是相應的餘數(remainder),那麼在幾乎所有的計算系統中,都滿足a=b*q+r,其中|r|<|a|。因此r有兩個選擇,一個為正,一個為負;相應的,q也有兩個選擇。如果a、b都是正數的話,那麼一般的程式設計語言中,r為正數;或者如果a、b都是負數的話,一般r為負數。但是如果a、b一正一負的話,不同的語言則會根據除法的不同結果而使得r的結果也不同,並且一般r的計算方法都會滿足r=a-(a/b)*b

常見語言
 (1) C/Java語言
  C/Java語言除法採用的是趨零截尾(事實上,C89對於除數或被除數之一為負數情況的結果是未定義的;C99才正式確定了趨零截尾),即truncate除法。它們的模數運算子是%,並且此運算子只接受整型運算元。一個規律是,模數運算的結果的符號與第一個運算元的符號相同(或為0)。因此(-11)%5=-11-[(-11)/5]*5=-11-(-2)*5=-1。

 (2) C++語言
  C++語言的截尾方式取決於特定的機器。如果兩個運算元均為正,那麼模數運算的結果也為正數(或為0);如果兩個運算元均為負數,那麼模數運算的結果為負數(或為0);如果只有一個運算元為負數,那麼模數運算的結果是取決於特定實現的。

 (3) Python語言
  Python語言除法採用的是趨負無窮截尾,即floor除法。它的模數運算子也是%,並且此運算子可以接受浮點運算元。一個類似的規律是,模數運算的結果的符號與第二個運算元的符號相同。因此(-11)%5=-11-[(-11)/5]*5=-11-(-3)*5=4。(所以n%10中,如果n為負數,結果也有可能為正數)
  這裡需要注意的是,Python 3.x中"/"運算子的意義發生了變化,"/"產生的結果將不會再進行截尾;相應的"//"運算子的結果才會進行截尾。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.