首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-10-27 
关于unsiged int和int相加的一个面试提#include stdio.hint main(void){unsigned int a 6int b -20

关于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转型了呢?


这样说更准确:

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

热点排行