在算術運算中混合有符號和無符號整數

在算術運算中混合 signedunsigned 整數通常不是一個好主意。例如,以下示例將輸出什麼?

#include <stdio.h>

int main(void)
{ 
    unsigned int a = 1000;
    signed int b = -1;

    if (a > b) puts("a is more than b");
    else puts("a is less or equal than b"); 

    return 0;
}  

由於 1000 大於 -1,你會期望輸出為 a is more than b,但情況並非如此。

不同整數型別之間的算術運算在由所謂的通常算術轉換定義的公共型別內執行(參見語言規範,6.3.1.8)。

在這種情況下,常見型別unsigned int,因為,如通常的算術轉換中所述

714 否則,如果具有無符號整數型別的運算元的秩大於或等於另一個運算元的型別的秩,則帶有符號整數型別的運算元將轉換為具有無符號整數型別的運算元的型別。

這意味著 int 運算元 b 將在比較之前轉換為 unsigned int

當 -1 轉換為 unsigned int 時,結果是最大可能的 unsigned int 值,大於 1000,這意味著 a > b 為假。