2012軟考程序員輔導:C語言中無符號擴展和帶符號擴展

字號:

程序員C語言中,當不同類型的數據進行運算的時候,就會發(fā)生強制或隱式類型轉換,通常是低精度的數據類型擴展到高精度的。有些時候,低精度的位數比較少,擴展到高精度的時候,就要在前面補充一些位。那么這些位是補0還是補1呢?這就涉及到無符號擴展和帶符號擴展。
    擴展的原則是:1.有符號的數據類型,在向高精度擴展時,總是帶符號擴展
    2.無符號的數據類型,在向高精度擴展時,總是無符號擴展
    怎么理解呢?首先來看一道題目,按此題目講解完你就明白了!
    charca=128;
    unsignedcharucb=128;
    unsignedshortusc=0;
    1)usc=ca+ucb;
    printf("%x",usc);
    2)usc=ca+(unsignedshort)ucb;
    printf("%x",usc);
    3)usc=(unsignedchar)ca+ucb;
    printf("%x",usc);
    4)usc=ca+(char)ucb;
    printf("%x",usc);
    問,在1、2、3、4這4種情況下分別輸出什么?
    分析:
    1)對于char類型,有符號,128已經溢出了,其二進制是10000000,第一位會被當成符號位,也是就是說此時它是負數了,它擴展成unsignedshort時,帶符號位擴展,符號位為1,所以在前方補1,結果是111111111000000.ucb類型為nsignedchar,無符號,二進制是10000000,擴展成unsignedshor,無符號擴展,所以補0,結果是0000000010000000,。相加結果為10000000000000000由于unsignedshort是二字節(jié),舍棄最前面的1,所以得到0x0,
    2)情況和1一樣,只是將ucb顯示強制轉換為unsignedshort,所以得到0x0,
    3)ca先強制轉換為unsignedchar,仍然是10000000,注意此時轉換后已經是一個無符號數,所以再往unsignedshort擴展時,為無符號擴展,結果為0000000010000000,ucb擴展后
    也是0000000010000000,相加結果為0000000100000000,所以結果為0x100
    4)ca轉為unsignedshort,帶符號擴展,為111111111000000,ucb先強制轉換為char,然后再轉為unsignedshort,此時也要帶符號擴展,所以也是111111111000000,兩數相加,得到11111111100000000,所以結果為0xff00