前言
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。
