C語言面試易錯點:負數整形的除法和取余


C語言整形的除法的結果需要取整,例如5 / 3 = 1。C語言中的取整方式是向零取整。

取整風格共有3種:

  1. 向零取整。即向坐標軸0的方向,取最近的整數。
  2. 向上取整。也就是向+∞取整,即取不小於結果的最小整數。
  3. 向下取整。也就是向-∞取整,即取不大於結果的最大整數。

所以,C語言中計算-5除以3,因為實數結果約為-1.67,向零取整,得到結果為-1。

關於除法,人們常常用向右移位的方式來快速計算一個數除以2的冪的結果,例如16 / 4 = 4就是把10000右移2位得到100,即4;9 / 4 = 2就是把1001右移2位得到2。事實上,這種快速計算的方法,是一種向下取整的過程,所以它只適用於被除數為正數的情況。若被除數為負數,這種右移的快速計算方式就是錯誤的了。下面用代碼來驗證一下,從10到-10,分別計算他們除以4和右移2位的結果:

#include <stdio.h>

int main()
{
  int i = 0;

  for (i = 10; i >= -10; i--)
  {
    printf("%d / 4 = %d\r\n", i, i / 4);
    printf("%d >> 2 = %d\r\n", i, i >> 2);
    printf("\r\n");
  }

  getchar();
    
  return 0;
}

程序運算結果如下圖所示:

可見,當被除數為正數的時候,除以4和右移2位的結果是一樣的。但是,當被除數為負數的時候,這兩個結果並不一定相同。

關於負數的右移操作的解釋:以-6為例,6的二進制形式是110,所以-6的補碼形式是第一位符號位為1,數據位是110取反加1,得到1010。1010右移2位,得到10。取出10的符號位1,數據位是0,數據位取反加1得到10,即十進制的2。也就是十進制-6右移2位得到十進制的-2。

有了除法的基礎,取余(也叫求模)操作根據公式計算就可以了。設A除以B的結果為Q,余數為R,則A = B * Q + R, R = A - B *Q。例如求-8 % 3,因為-8 / 3 = -2,那么余數就是-8 - 3 * (-2) = -2

取余操作除了套用公式來做,還有一個快捷的經驗,就是取余的結果的符號永遠和被除數的符號一樣。這個經驗可以用下面的例子來解釋:去銀行借了8萬塊貸款,每個月還3萬,還了2個月之后,還剩下2萬沒還,這個2萬依然是欠的,所以和8萬的符號相同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM