这串代码中为什么x会大于y呢


#include <stdio.h>
int main()
{
    int x = -1;
    unsigned int y = 2;
    if (x > y)
    {
         printf("x is greater");
    }
     else
    {  
        printf("y is greater");
    } 
    return 0;
}

x在二进制中表示为全1,就是11111.........1111
y在二进制中表示为0000000000......10
y是无符号数,x是有符号数,会被读成2的32次方-1,在比较的时候会按位比较,自然是全1的要大于0000010
如果y也是有符号数,会按照有符号的规则,就是-1<2

知识点🤪: 算数转换
在x和y进行比较时使负数x转换成了unsigned类型
x的补码为11111111111111111111111111111111
y的补码为0000000000000000000000000010
比较时x就会变成很大的数所以出现了x > y的情况

比较C中的两个值时,它们必须属于同一类型。在这种情况下(int和unsigned int),int值将首先转换为unsigned int。 其次,C中的无符号整数运算以该类型的最大值+ 1为模(即,它“循环”,因此UINT_MAX + 1再次为0,反之亦然)。因此,将负值转换为无符号结果的数量非常大。
int值的第一位用于定义它是正数还是负数。 (1负数,0正数) 在比较之前,两个变量都会转换为unsigned int,其中第一位中的1将被解释为您的数字的一部分。
正确的代码如下:

 
#include <stdio.h>
int main()
{
    int x = -1;
    unsigned int y = 2;
    if (x >(int) y)
    {
         printf("x is greater");
    }
     else
    {  
        printf("y is greater");
    } 
    return 0;
}

int和unsigned int比较,int会转为unsigned int,也就是2的32次方-1