程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 【 c語言中無符號和有符號的加法運算】【深入理解】--【sky原創】,加法sky

【 c語言中無符號和有符號的加法運算】【深入理解】--【sky原創】,加法sky

編輯:關於C語言

【 c語言中無符號和有符號的加法運算】【深入理解】--【sky原創】,加法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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved