unsigned int和signed char比较

我想比较一个无符号的int与这样一个签名的字符:

int main(){ unsigned int x = 9; signed char y = -1; x < y ? printf("s") : printf("g"); return 0; } 

我期待着o / p是“g”。 相反,它的“s”。 这里做了什么样的转换?

C99的第6.3.1.8通常的算术转换详细说明了隐式整数转换。

如果两个操作数具有相同的types,则不需要进一步的转换。

这不算数,因为它们是不同的types。

否则,如果两个操作数都具有带符号的整数types或两者都具有无符号的整数types,则将具有较小整数转换等级的操作数转换为具有较高等级的操作数的types。

这是不计算,因为一个签名,另一个无符号。

否则,如果具有无符号整数types的操作数的级别大于或等于另一操作数的types的级别,则将具有有符号整数types的操作数转换为具有无符号整数types的操作数的types。

答对了。 x的排名比y因此y被提升为unsigned int 。 这意味着它从-1变成UINT_MAX ,远远大于9。

其余的规则不适用,因为我们已经find了我们的比赛,但我会包括他们的完整性:

否则,如果具有有符号整数types的操作数的types可以表示具有无符号整数types的操作数types的所有值,则将具有无符号整数types的操作数转换为具有有符号整数types的操作数的types。

否则,两个操作数都转换为与带符号整数types的操作数types相对应的无符号整数types。


下面显示了与这个问题相关的等级。 所有的等级在C99,第6.3.1.1节, 布尔,字符和整数中都有详细的介绍,所以你可以参考这些。

long long int的级别应大于long long int的级别,该级别应大于long int的级别,该级别应大于short int的级别,该级别应大于signed char的级别。

char的等级应该等于被signed charunsigned char的等级。

我的猜测是y被提升为unsigned int ,这成为一个很大的价值(由于包装)。 因此条件得到满足。

运行下面的代码:

 int main(){ unsigned int x = 9; signed char y = -1; printf("%u\n", (unsigned int)y); x < (unsigned int)y ? printf("s") : printf("g"); return 0; } 

输出是:

 4294967295
小号

铸造后,y需要非常大的价值。 这就是为什么输出是s。

char被提升为unsigned int,值为MAX_UINT,大于9。

通过下面的链接参考caf的注释:当你将一个超出范围的数字转换成一个无符号的types时,通过反复地增加或减去一个大于该types的最大值的值,

C:将签名转换为无符号

在这种情况下,UINT_MAX + 1(在您的平台上为4294967296)将添加到-1以提供4294967295。