天天看點

C語言(不要告訴我你懂加法)

就在剛才!正在研究南海局勢,突然手邊闖進來一個難産般的面試題,乍一看是一道加法題,一執行發現與常理相悖,我頓時面如土色,壞了!明天馬上就要奔襲南海了,這下怎麼辦?怎麼辦?這該不會是美國間諜故意來拖延我時間,以免明天在南海跟我硬碰硬使出的陰招吧?!

某美國間諜,想用如下面試題,來困擾我,以此達到不可告人的秘密。在此我強烈建議小夥伴們先别看以下代碼分析,先自己親手把下面的代碼寫一遍,編譯一遍,自己猜猜結果會是什麼,然後執行一遍試試看。你就會看到美帝亡我之心不死!

unsigned int a = 6;

int b = -20;

if(a + b > 0)

printf("a+b: %d\n", a+b);

else

printf("you will get nothing.\n");

這麼簡單的代碼,乍一看,a+b 明顯等于 -14 ,是以if語句不可能成立,程式的執行結果不就是列印出 you will get nothing.這麼一句話嗎? 但是事情的結果往往是出乎意料的,居然列印的是:

a+b: -14

這就奇了怪了!!既然結果是-14,那這個if語句就不成立,既然不成立,那這句話又怎麼列印出來了? 見了鬼了!繞了個圈居然出現悖論! 這裡面究竟有什麼陰謀? 美帝究竟在打什麼算盤!? 我陷入了深深的思考,百思不得其姐!

慢着,仔細觀察 a+b > 0 這語句你會發現,該語句中出現了無符号數、有符号數,同時右邊的0也是一個int型資料,辣麼,根據C語言的資料隐式轉換規則,資料将會統統被轉成無符号數!

既然如此,-20就會變成一個巨大無比的正整數,因為負數在記憶體中是以補碼的形式存在的,此時-20的真正記憶體這樣的:

1111 1111 1111 1111 1111 1111 1110 1100

總共占用32位記憶體,即4個位元組。

這個數值一旦跟無符号數一起運算,立即按正碼計算,被當成是無符号數,即4294967276,一個好好的-20瞬間變成40多億,然後再加個6,能不比0大嗎? 是以,if語句必然成立。

那在printf語句中,怎麼又不是列印40多億,而是規規矩矩的-14呢?那是因為 %d 作怪,%d不管你後面是什麼鬼,都會被他一律視為 有符号十進制整數來看待。

至此,謎團完全解開!美帝憑這三腳貓功夫,就想在南海耍陰謀陽謀,奪我南海霸我島礁,沒門!當然,在這風聲鶴唳,草木皆兵的非常時期,我們必須步步為營,謹慎行事!總結一下我們學到的東西。

美國間諜卑劣題目的警醒

1、有符号數和無符号數在一起運算時,統一向無符号數轉化。

2、除了面試筆試和作死,不要試圖将他們放一起運算。

3、有些無力燒腦的語言(如Java)已經放棄無符号數。

4、美帝亡我之心不死,但我們不怕。好好工作好好學習,就是對國家的最大支援,其他一切都是扯淡。