关于unsiged int跟int相加的一个面试提
关于unsiged int和int相加的一个面试提
输出的结果是
-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
个人见解, 请指教
------解决方案--------------------
这样说更准确:
当表达式中存在有符号类型和无符号类型时,默认情况下计算的结果将转化为无符号类型
#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
个人见解, 请指教
------解决方案--------------------
这样说更准确:
当表达式中存在有符号类型和无符号类型时,默认情况下计算的结果将转化为无符号类型