在算术运算中混合有符号和无符号整数

在算术运算中混合 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 为假。