原文:【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】
第一题
#include<stdio.h>
int main()
{
unsigned int a=6;
int b=-20;
printf("%d\n",a+b);
(a+b)>6? puts(">6"):puts("<=6");
return 0;
}
答案是:>6
第二题
#include<stdio.h>
int main()
{
unsigned int a=6;
int b=-2;
printf("%d\n",a+b);
(a+b)>6? puts(">6"):puts("<=6");
return 0;
}
答案是: <=6
很多有经验的工程师看到此题目以后会觉得两个答案都是大于6,那么就想当然啦,这是我们很多人会出错的一个题,计算机告诉我们不要相信直觉,要动手算算。
首先先说明几点:
1、有符号和无符号相加的运算,unsigned int 要比int 的级别要高,因此在做加法运算时会自动隐式转换为unsigned int , 注意的是,负数在转换的时候补码是不变的
2、负数在进行运算的时候是以补码进行运算的,先写出-2的二进制,就是最高位为1,即1000 0000 0000 0010
这是在32位系统下的,那么补码就是取反加1
1111 1111 1111 1101 ---> 1111 1111 1111 1110
对于正数来说 6 的补码就是本身,也就是 0000 0000 0000 0110
6+ (-2)就可以算啦,结果是4 ,那为什么这么小呢,可不是6-2=4这样理解喔,很多人误以为会算出很大的数是因为最高位为1,那么就很大了,但是如果相加起来的话,例如这个例子,最高位已经溢出了,溢出的数就要舍去,因此答案才为4,至于第一题为什么会大于6原理是一样的,我就不多说了。
欢迎交流
新浪博客:http://blog.sina.com.cn/u/2049150530
博客园:http://www.cnblogs.com/sky-heaven/
知乎:http://www.zhihu.com/people/zhang-bing-hua