【C語言】表示式求值中的型別轉換問題
阿新 • • 發佈:2019-01-04
表示式求值中的型別轉換問題
隱式型別轉換
表示式求值是程式中常見的一類問題,通常來講只要知道各種運算子及其運算規則,表示式求值都是比較簡單的。但是,有時候結果並非我們所期待的。首先來看一段程式:
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;
此處進行了隱式型別轉換,會存在精度丟失。