在嵌入式開發中,常常涉及到數據類型的轉換。經過比較,將幾種經典案例總結如下。歡迎大家交流。
1、int 與 float 的轉換
1 int a = 3; 2 int b = 4; 3 float c; 4 c = a/b;
上面代碼運行結果為0.000000
int a = 3; int b = 4; float c; c = (float)a/b;
上面代碼運行結果為0.750000
1 int a = 3; 2 int b = 4; 3 float c; 4 c = (float)(a/b);
上面代碼運算結果為0.000000
1 int a = 3; 2 int b = 4; 3 float c; 4 c = a/(float)b;
上面代碼運算結果為0.750000
第一段代碼,a為int類型,b為int類型,int類型的除法只保留整數。然后等式右邊的數據類型向等式左邊的數據類型隱式轉換。
第二段代碼,將a轉為float類型,然后在與b相除。b是int類型,a是float類型。b向a的類型轉換。則全部為float類型。故計算結果為浮點型。
第三段代碼,使用括號將a/b先運算,由於是整數的除法,所以運算結果為0,又因為等號右邊自動向等號左邊數據類型轉化,最終為0.000000。
第四段代碼,將b轉為float類型,然后在被a除,int除以float,低類型自動向高類型轉換。a/b變為float類型除法。故計算結果為0.000000。
總結:等號右邊的數據類型會自動向等號左邊的數據類型轉換
算式中,若存在數據類型不同的數據,低等級的數據類型自動向高等級的數據類型轉換。
2、float向int類型轉換
1 int a; 2 float b = 1.5f; 3 float c = 4.9f; 4 a = c/b;
上面代碼運算結果為3.
1 int a; 2 float b = 1.5f; 3 float c = 4.9f; 4 a = (int)c/b;
上面代碼運算結果為2.
1 int a; 2 float b = 1.5f; 3 float c = 4.9f; 4 a = (int)(c/b);
上面代碼運算結果為3.
上面的代碼與int轉float原理類似。在這里就不重復分析。若有疑問,歡迎留言。
3、函數調用中參數傳遞時,系統隱式地將實參轉換為形參的類型后,賦給形參。函數有返回值時,系統將隱式地將返回表達式類型轉換為返回值類型,賦值給調用函數。
1 float ADD(float a,float b) 2 { 3 4 float c; 5 printf("a=%f\n",a); 6 c = a+b+0.1f; 7 printf("c=%f\n",c); 8 return c; 9 } 10 11 int main(void) { 12 13 int a = 3; 14 int b = 4; 15 16 int d; 17 18 d = ADD(a,b); 19 20 printf("d=%d\n",d); 21 return 0; 22 }
上面代碼運行結果為:a = 3.000000,c = 7.100000,d = 7
4、unsigned int 與int的互相轉化問題
1 unsigned int a = 6; 2 int b = -20; 3 (a+b)>6?printf(">6\n"):printf("<6\n");
上面的代碼運行結果為>6.
當表達式中同時存在有符號類型和無符號類型時所有的操作數都自動轉換為無符號類型。也就是說,b從int類型轉為unsigned int類型時,數據發生了變化。
如果您使用的嵌入式機時16為機,那么b的二進制為1111 1111 1110 1100,轉化為十六進制為:0xFFEC,轉化為十進制為65516。65516+6>6。
如果int >0,那么轉化為unsigned int就不會發生這樣的數據跳變。
那么,負數的int值該如何轉為unsigned int類型呢?
盡量避免吧。轉換器來非常麻煩。
參考文獻:(更多經典,盡在參考文獻喲)
[1].https://bbs.csdn.net/topics/30444126
[2].https://blog.csdn.net/yinzewen123/article/details/80547836