bad*_*ash 4 c type-conversion char unsigned-integer
我试图将unsigned int与这样的signed char进行比较:
int main(){
unsigned int x = 9;
signed char y = -1;
x < y ? printf("s") : printf("g");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期待o/p为"g".相反,它的"s".这里进行了什么样的转换?
pax*_*blo 23
C99的部分6.3.1.8,通常的算术转换,详细说明了隐式整数转换.
如果两个操作数具有相同的类型,则不需要进一步转换.
这不算数,因为它们是不同的类型.
否则,如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型.
这不计算,因为一个签名,另一个签名.
否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型.
答对了.x排名高于yy被提升为unsigned int.这意味着它变成-1了UINT_MAX大大超过9的变形.
其他规则不适用,因为我们找到了匹配但我会将它们包括在内以保证完整性:
否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型.
否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型.
与此问题相关的排名如下所示.所有等级都在C99,section 6.3.1.1,Boolean,character和integer中详细说明,因此您可以参考它们以获取更多详细信息.
等级
long long int应大于等级long int,等级int应大于等级short int,等级应大于等级signed char.军衔
char应等于的秩signed char和unsigned char.