C語言中的型別提升——基礎概念,但還有很多人搞不清
這就是為什麼在程式設計的過程中,要避免有符號數和無符號數的混用。我個人認為,在我們解決問題的時候,不要一味兒的想著怎麼用高階的技術解決。其實最重要的是基礎。一般情況下,大部分的問題都可以由C語言基礎解決。
接下來再看一個例子:
1 #include <stdio.h>
2
3 int main(int argc, char **argv){
4 int a=1000000,b=1000000;
5 long int c,c1,c2,c3;
6 c=a*b;//note1
7 c1=(long)a*b;//note2
8 c2=(long)a*(long)b;//note3
9 c3=(long)(a*b);//note4
10 printf("c=%ld, c1=%ld,c2=%ld, c3=%ld\n",c,c1,c2,c3);
11 return 0;
12 }
執行結果:
c=-727379968, c1=1000000000000,c2=1000000000000, c3=-727379968
note1和note4的列印結果是一樣的,原理也是一樣的,只不過在程式碼裡note1是隱式型別轉換,note4是顯式型別轉換,此處a*b的結果位數大於int的32位的範圍,發生了溢位,高於第31位的數值丟棄,剩下的在進行符號擴充套件,最後顯示為-727379968。而note2和note3,在計算出a*b的結果之前將a或b擴充套件為long型,提前避免了溢位問題,最後顯示為1000000000000。
結束!