1. 程式人生 > >【C語言】表示式求值中的型別轉換問題

【C語言】表示式求值中的型別轉換問題

   表示式求值中的型別轉換問題

隱式型別轉換

  表示式求值是程式中常見的一類問題,通常來講只要知道各種運算子及其運算規則,表示式求值都是比較簡單的。但是,有時候結果並非我們所期待的。首先來看一段程式:

int main()
{
char c1 = 12;
char c2 = 118;
char c3 = c1 + c2;
printf("c3=%d\n",c3);
return 0;
}

對於初學者來講,130是上述程式的正確輸出。然而,正確結果為:-126.


  這裡就遇到了型別轉換中的“整型提升”:C語言中的整型算術運算總是以至少預設整型型別的精度來進行的,為了獲得這個精度,表示式中的字元和短整型運算元在使用之前被轉換為普通整型。整型提升是一種隱式型別轉換。對上述程式進行分析,如下圖:


  再舉個例子:a=(~a^b<<1)>>1;該表示式中要對b的bit位進行左移一位,此時如果我們把b提升成整型,即使左移了一位(“丟掉了”左邊最高位),該位也並未丟失,仍存在其二進位制位中。

      算術轉換

如果一個運算子的兩側的資料型別不同,則先自動進行型別轉換,使二者具有同一種類型,然後進行運算。因此,整型、實型、字元型資料間可以進行混合運算。

  尋常算術體系:


  如果某個運算元的型別在上面這個列表中排名較低,那麼首先要隱式地轉換為另外一個運算元的型別後再執行運算。

  注意:要進行合理的算術轉換,否則會存在潛在問題。如:
float f = 3.14;
int num = f;

此處進行了隱式型別轉換,會存在精度丟失。