【 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