首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言除法 / 與取模 % 運算符詳解:區別、例子與負數規則

     編輯:C 語言問答

核心區別

正數例子:2 和 3


int a = 2, b = 3;
printf("2 / 3 = %d\n", a / b);  // 輸出 0 (整數除法向零截斷)
printf("2 %% 3 = %d\n", a % b); // 輸出 2 (余數 = 被除數 - 商*除數 = 2 - 0*3 = 2)
  • 整數除法:2 / 3 = 0(向零截斷,非向下取整)。
  • 取模:2 % 3 = 2。余數範圍:0 ≤ |余數| < |除數|,符號**與被除數相同** (C99 規定)。

負數情況(重點考點、易錯)

C99 規定:**整數除法向零截斷**,余數滿足 (a/b)*b + a%b == a,**余數符號同被除數**。

運算符名稱功能要求
/除法得**商** (quotient)運算元可為整數或浮點數
%取模/取余得**余數** (remainder)**運算元必須為整數類型**

**記憶口訣**:商向零取整,余數符號跟被除數(第一個數)。

浮點數除法


double x = 2.0, y = 3.0;
printf("2.0 / 3.0 = %f\n", x / y); // 0.666667
// 浮點數無 % 運算符,需用 fmod(x, y) ()

實際應用場景

  • 判斷奇偶:if (n % 2 == 0) // 偶數(負奇數 -3 % 2 == -1,非 1,故判斷奇數用 n % 2 != 0)。
  • 循環取模:index = (index + 1) % N; 實現環形緩衝區。
  • 提取數字位:digit = num % 10; 取個位,num /= 10; 右移。
  • 時間換算:sec = total % 60; min = total / 60 % 60; hour = total / 3600;。
  • 哈希映射:bucket = hash(key) % TABLE_SIZE;。

陷阱與最佳實踐

  1. 除數為 0:/ 和 % **均導致未定義行為 (UB) / 運行時異常 (SIGFPE)**,**必須預判檢查**。
  2. 負數取模可移植性:C89 允許實現定義余數符號,C99 統一為「同被除數」。跨平台代碼**不要依賴負數余數具體值**,或自行實現模運算(如 ((a % b) + b) % b 得非負余數)。
  3. 浮點數精度:0.1 + 0.2 != 0.3,金融計算用定點數/整數分位或 decimal 庫。
  4. 優化:編譯器會將 x / 2 優化為 x >> 1(無符號/正數),x % 2 優化為 x & 1。

總結

/ 求商,% 求余,**整數除法向零截斷,余數符號同被除數 (C99)**。
例子:2 / 3 = 0,2 % 3 = 2;-7 / 3 = -2,-7 % 3 = -1。
**除數為 0 是致命錯誤**,負數余數跨平台需謹慎。掌握數學定義 (a/b)*b + a%b == a 即可推導所有情況。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
表達式商 (a/b)余數 (a%b)驗證: 商*除數 + 余數
7 / 3212*3 + 1 = 7 ✅
-7 / 3-2-1(-2)*3 + (-1) = -7 ✅
7 / -3-21(-2)*(-3) + 1 = 7 ✅
-7 / -32-12*(-3) + (-1) = -7 ✅