#include<stdio.h>
void main()
{
unsigned x = 1;
signed char y = -1;
if(x > y)
printf("x > y");
else if(x == y)
printf("x == y");
else
printf("x < y");
printf("\n");
printf("%d",(signed char)x);
printf("\n");
printf("%d",(unsigned int)y);
}
OUTPUT:
x < y
1
-1
我期望输出为x == y,因为在比较时,签名字符应该转换为unsigned int? 请解释我x&lt; Y ...
答案 0 :(得分:3)
我期望输出为x == y,因为在比较时,签名字符应该转换为unsigned int?
嗯,你已经到了一半。
当-1
的值被转换(实际上被提升)为unsigned int
时,该表示产生可由该类型表示的最大可能值。因此,促销价值变得大于x
1
。
引用C11
,章节§6.3.1.8,常用算术转换
否则,如果具有无符号整数类型的操作数的等级大于或等于 等于另一个操作数的类型的等级,然后是操作数 有符号整数类型转换为带有unsigned的操作数的类型 整数类型。
澄清一下,促销并不意味着,它取消了签名。带符号的操作数(值)被视为提升类型。该值由位表示确定。细节:章节§6.3.1.3,
否则,如果新类型是无符号的,则通过重复添加或转换该值 减去一个可以在新类型中表示的最大值 直到该值在新类型的范围内。
添加到上面的用法
printf("%d",(signed char)x);
和
printf("%d",(unsigned int)y);
不好。 %d
期望有符号整数类型(int
)作为参数。
signed char
值,请使用%hhd
unsigned int
,请使用%u