这是我的代码:
#include<stdio.h>
void main()
{
unsigned x = 1;
signed char y = -1;
if(x>y) printf("x>y");
else printf("x<=y");
}
在gcc上编译时,代码的输出为"x<=y"
请向任何人解释。
答案 0 :(得分:1)
在x>y
中,我们有一个unsigned
和一个signed char
。 C的规则说,通过将signed char
转换为unsigned
值来使类型匹配,然后执行比较。
当将-1转换为unsigned
时,结果当然不能为-1,因为unsigned
不能表示负值。 C的规则说,通过向该值加上unsigned
(将其转换为非负值所需的次数),可以将负值转换为UINT_MAX+1
。例如,如果UINT_MAX
为65535,则添加65536。因此,将-1转换为unsigned
的结果是-1 + 65536 = 65535。
因此,比较变为1>65535
,这是错误的。 ({UINT_MAX
也可以更大,例如4,294,967,295,在这种情况下,比较就变成1>4294967295
,这也是错误的。)