這是一道朗訊的筆試題(我把一些相關資料匯總了一下,希望大家能進來廣泛的探討,不甚感激!)
#include
int main()
{
char ca;
unsigned char ucb;
unsigned short usc;
ca = 128;
ucb =128;
usc = ca + ucb;
printf("%d\n", usc);
usc = ca + (short)ucb;
printf("%d\n", usc);
usc = (unsigned char)ca + ucb;
printf("%d\n", usc);
usc = ca + (char)ucb;
printf("%d\n", usc);
getchar();
return EXIT_SUCCESS;
}
結果是:0, 0, 256, 65280.
這道題最難得部分,莫過於你是否理解c語言中的數據類型轉換 。
有個名詞“Inerger Promotion"(整型提升):在算術類型中有這么一種轉換,有符號或無符號的char型,short型和Bit-field在做算術運算之前,首先要做整型提升,然后才能參與運算。(其它的一些類型之間的轉換,可以參考任何一本c語言書)
一下是一些關鍵性概念:
無論要做什么運算都要先看這個數存入內存是什么樣子的;
類型提升/截斷的時候都是對內存中數據的操作,提升的時候就是需要 進行擴位:對無符號數擴位的時候直接把擴出的位上補零即可(因為unsigned都是正數);有符號
數進行擴位,則進行符號位擴展(sign extension)如果是正數即原最高位是零則補零,如果是負數即原最高位是1則全補1;進行數據截斷的時候是從低位開始數位數然后截斷,這里注意我們使用的一般都是小端機(little Endian)-----------http://blog.csdn.net/gukesdo/article/details/6909766
以下是一些參考博客和例題: