【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】
生活随笔
收集整理的這篇文章主要介紹了
【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 第一題
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原理是一樣的,我就不多說了。 歡迎交流
#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;?
}?
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
轉載于:https://www.cnblogs.com/sky-heaven/p/4153604.html
總結
以上是生活随笔為你收集整理的【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu2159(二维完全背包)
- 下一篇: 国科大微积分试题