请告诉我为什么C代码会如此详细地表现出来?

时间:2019-02-16 15:09:45

标签: c gcc

这是我的代码:

#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"

请向任何人解释。

1 个答案:

答案 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,这也是错误的。)