【 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM