【发布时间】:2019-02-16 15:09:45
【问题描述】:
这是我的代码:
#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"
请任何人解释一下。
【问题讨论】:
这是我的代码:
#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"
请任何人解释一下。
【问题讨论】:
在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,也是假的。)
【讨论】: