#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; } #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,那么就想当然啦,这是我们很多人会出错的一个题,计算机告诉我们不要相信直觉,要动手算算。 1、有符号和无符号相加的运算,unsigned int 要比int 的级别要高,因此在做加法运算时会自动隐式转换为unsigned int , 注意的是,负数在转换的时候补码是不变的 2、负数在进行运算的时候是以补码进行运算的,先写出-2的二进制,就是最高位为1,即1000 0000 0000 0010 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
本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/4153604.html,如需转载请自行联系原作者