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

C 語言整數除法陷阱:-1/2 為什麼等於 0 而不是 -0.5?

     編輯:關於C語言

現象重現


#include 

int main() {
    float a = -1 / 2;
    printf("%f\n", a);  // 輸出:0.000000
    return 0;
}

預期 -0.5,實得 0.0。為什麼?

根本原因:整數除法截斷向零

  1. -1 和 2 均為 int 字面常量**
  2. -1 / 2 進行整數除法,結果為 int 類型
  3. C 標準規定:整數除法**向零截斷**
  4. -1 / 2 = 0(數學值 -0.5,截斷向零得 0)
  5. 隨後 0 隱式轉換為 float 賦給 a

C99 標準明確規定

When integers are divided, the result of the / operator is the algebraic quotient with any fractional part discarded (truncation toward zero).

即:**丟棄小數部分,向零截斷**。

  • 5 / 2 = 2
  • -5 / 2 = -2
  • 5 / -2 = -2
  • -5 / -2 = 2
  • -1 / 2 = 0

正確寫法:強制浮點運算


// 方法 1:至少一個運算元為浮點數
float a = -1.0f / 2;        // -0.5
float b = -1 / 2.0;         // -0.5
float c = (float)-1 / 2;    // -0.5
float d = -1 / (float)2;    // -0.5

// 方法 2:用浮點字面量
float e = -1.0 / 2.0;       // double 運算再轉 float

延伸:取模運算配合除法

C 保證:(a / b) * b + a % b == a
故 -1 % 2 = -1(因 0 * 2 + (-1) = -1)。

其他語言對比

工程避坑指南

  1. 混合運算時顯式轉型:(float)x / y 或 x / (float)y
  2. 常量用浮點後綴:1.0f、2.0
  3. 嵌入式定點運算:用 Q 格式或分子分母分離,避免除法
  4. 啟用編譯器警告:-Wconversion 可檢測隱式整數到浮點轉換

總結

-1/2=0 不是 Bug,是 C 語言整數除法向零截斷語義的必然結果。理解「字面量類型決定運算類型、整數除法截斷規則、隱式轉換時機」三個環節,即可徹底避開此坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
語言-1 / 2-1 % 2備註
C (C99+)0-1向零截斷
C++ (C++11+)0-1同 C
Python 3-0.51/ 為真除法,// 向下取整
Java0-1向零截斷
JavaScript-0.5-1全浮點數
Go0-1向零截斷
Rust0-1向零截斷