C語言中的無符號擴展和有符號擴展


前言

C語言中,當不同類型的數據進行運算時,會發生強制或隱式類型的轉換,通常是低精度的數據類型擴展到高精度類型。
這就得考慮擴展時是補0還是補1了。

擴展原則

1.有符號的數據類型,在向高精度擴展時,總是帶符號擴展
2.無符號的數據類型,在向高精度擴展時,總是無符號擴展

例子

#include <cstdio>
#include<cstdlib>
int main(){
    char ca=128;
    unsigned char ucb=128;
    unsigned short usc=0;
    //①
    usc=ca+ucb;
    printf("%x\n",usc);
    //②
    usc=ca+(unsigned short)ucb;
    printf("%x\n",usc);
    //③
    usc=(unsigned char)ca+ucb;
    printf("%x\n",usc);
    //④
    usc=ca+(char)ucb;
    printf("%x\n",usc);

    system("pause");
}

①對於char類型ca,有符號,且 \(128_{10}=1000\quad0000_2\) 溢出,第一位為符號位,它擴展成unsigned short時,帶符號位擴展,符號位為1,故在前面補1,結果是1111 1111 1000 0000。而對於unsigned char 類型的ucb,二進制是1000 0000,無符號,擴展成unsigned short時往前補0,結果是0000 0000 1000 0000,相加結果為1 0000 0000 0000 0000。由於unsigned short是二字節,舍棄最前面的1,所以得到0x0。


②情況和1一樣,只是將ucb顯示強制轉換為unsignedshort,所以得到0x0。


③ca先強制轉換為unsigned char,仍然是1000 0000,注意此時轉換后已經是一個無符號數,所以再往unsigned short擴展時,為無符號擴展,結果為0000 0000 1000 0000,ucb擴展后也是0000 0000 1000 0000,相加結果為0000 0001 0000 0000,所以結果為0x100。


④ca轉為unsigned short,帶符號擴展,為1111 1111 1000 0000,ucb先強制轉換為char,然后再轉為unsigned short,此時也要帶符號擴展,所以也是1111 1111 1000 0000,兩數相加,得到1 1111 1111 0000 0000,所以結果為0xff00。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM