1. 程式人生 > >有關c語言資料型別轉換之char,unsigned char,unsigned short

有關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;進行資料截斷的時候是 

以下是一些參考部落格和例題: