关于unsiged int跟int相加的一个面试提

关于unsiged int和int相加的一个面试提
#include <stdio.h>
int main(void)
{
        unsigned int a = 6;
        int b = -20;
        printf("a + b =%d\n",a + b); 
        a + b > 6 ? puts("1"):puts("2");
        -14 > 6 ? puts("1"):puts("2");
        return 0;
}


输出的结果是
-14
1
2
我比较不理解的是第一个输出结果,按第二个输出结果迹象来看,应该是一个比较大的整型数才对吧?

------解决方案--------------------
假设是32位数据

a的32位模式是00000000 00000000 00000000 00000110 (6)
b的32位模式是11111111 11111111 11111111 11110110 (-20)

a + b 后的位模式是11111111 11111111 11111111 11111100

printf("a + b =%d\n",a + b); 
因为printf()中格式要求是%d, 即要用十进制有符号, 所以很明显这里的a+b的位模式就将被解释成有符号数
即-14


a + b > 6 ? puts("1"):puts("2");
因为a是一个无符号, 而b是有符号, 所以a+b将被强制转换成无符号
所以这里a+b的位模式将被解释成无符号数, 所以这里a+b将是一个很大的数, 所以输出1

个人见解, 请指教

------解决方案--------------------
引用:
Quote: 引用:

无符号的 

printf("%u")
那a和b相加的时候b是否向unsigned转型了呢?


这样说更准确:

当表达式中存在有符号类型和无符号类型时,默认情况下计算的结果将转化为无符号类型