C语言无符号数和有符号数的细节

#include
#include

int main()
{
int a = -1;
unsigned int b = 1;

if(a > b)
    printf("a > b, a = %d, b = %u\n", a, b);
else
    printf("a <= b, a = %d, b = %u\n", a, b);
exit(0);

}
//运行结果
a > b, a = -1, b = 1

我想问的是网上资料说的都是有符号数int 向无符号数unsigned int转化
,因为在32位机上,int是32位,范围–2,147,483,648 to 2,147,483,647
,unsigned int是32位,范围0 to 4,294,967,295,所以int向范围更大的隐式
转换,可是我不能理解的是为什么不可以unsigned int隐式转化为int呢,超过unsigned int正数最大值的用负数表示不是一样的道理吗?比如unsigned int
的值2,147,483,648超过int的最大值,那么转化为int时就变为对应的负数,这样不可以吗?求解各位大佬

int比unsigned int多了一位符号位。
int的负数是用补码来储存的。
int和unsigned int型都是4个字节,即32位的二进制数。
其中int型把最高的1位来代表符号位。
所以int型的负数强制转换成unsigned int型就会变成一个很大的正数了,所以你代码里面的a>b。

附上测试代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    unsigned int b =  4294967295;
    printf("b : %u\n", b);
    int a = (int) b;
    printf("a : %d\n", a);
    return 0;
}

打印结果:

b : 4294967295

a : -1