码迷,mamicode.com
首页 > 编程语言 > 详细

【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

时间:2014-12-11 10:03:37      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   os   sp   on   div   

原文:【 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

 

【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

标签:style   blog   http   io   color   os   sp   on   div   

原文地址:http://www.cnblogs.com/lonelyxmas/p/4156771.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!