我试图将unsigned int与这样的signed char进行比较:
int main(){
unsigned int x = 9;
signed char y = -1;
x < y ? printf("s") : printf("g");
return 0;
}
我期待o / p为“g”。相反,它的“s”。这里做了什么样的转换?
答案 0 :(得分:23)
C99部分6.3.1.8
,常用算术转换,详细说明了隐式整数转换。
如果两个操作数具有相同的类型,则不需要进一步转换。
这不算数,因为它们的类型不同。
否则,如果两个操作数都有有符号整数类型或两者都有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数类型。
这不计算,因为一个是签名的,另一个是未签名的。
否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则带有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。 / p>
宾果。 x
的排名高于y
,因此y会提升为unsigned int
。这意味着它会从-1
变为UINT_MAX
,大大超过9。
其他规则不适用,因为我们找到了匹配但我会将它们包括在内以便完整:
否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数的操作数的类型类型。
否则,两个操作数都将转换为无符号整数类型,对应于带有符号整数类型的操作数类型。
与此问题相关的排名如下所示。所有排名都在C99,6.3.1.1
部分,布尔,字符和整数中详细说明,因此您可以参考该部分以获取更多详细信息。
long long int
的等级应大于long int
的等级 应大于int
的等级,该等级应大于short int
的等级,该等级应大于signed char
的等级。
char
的等级应等于signed char
和unsigned char
的等级。
答案 1 :(得分:2)
我的猜测是y
被提升为unsigned int
,这会成为一个很大的价值(由于包装)。因此,条件得到满足。
答案 2 :(得分:2)
请输入以下代码:
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 s
投射后,y的值非常大。这就是输出的原因。
答案 3 :(得分:1)
char被提升为unsigned int,其值为MAX_UINT,大于9。
答案 4 :(得分:1)
请参阅下面链接中caf的评论:当您将超出范围的数字转换为无符号类型时,通过重复添加或减去一个超过该类型的最大值的范围将其带入范围 - < / p>
C : Convert signed to unsigned
在这种情况下,您平台上的UINT_MAX + 1(即4294967296)将添加到-1以提供4294967295。