有關c語言資料型別轉換之char,unsigned char,unsigned short
這是一道朗訊的筆試題(我把一些相關資料彙總了一下,希望大家能進來廣泛的探討,不甚感激!)
#include <stdio.h>
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;進行資料截斷的時候是
以下是一些參考部落格和例題: