? ? ? ? 整型數據和實行數據之間可以進行運算,而且字符型數據可以和整型數據通用,所以整型、實型、字符型數據之間也是可以進行運算的,但在運算處理之前,不同類型的數據要事先轉換成同一種數據類型。轉換方法有兩種:自動轉換和強制轉換。
(1)自動轉換
原則:
1、若參與運算量的類型不同,則先轉換成同一類型,然后進行運算;
2、轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int型轉換成long型后再進行運算;
3、所有浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成double型,再進行運算;
4、char型和short型參與運算時,必須先轉換成int型;
5、在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長于左邊時,將丟失一部分數據,這樣會降低精度,丟失的部分按四舍五入向前舍入。
?
需要注意的是,char轉為double的過程是一次性的,無需中間過程,其他轉換同樣。
如果運算中同時包含有符號signed和無符號unsigned的數據,會自動地隱式地將有符號轉換為無符號,即signed->unsigned。
舉例說明
#include <stdio.h>int main(void)
{int a = -1;unsigned int b = 1;int c = 0;c = a > b ? a : b; return 0;
}
正常邏輯是-1 < 1,所以c的值是1。
但實際運行后c的值是-1。
在編譯的時候編譯器兄弟也告訴我們:
解析:當運算a > b時,a先自動轉換成unsgined,其值即為-1,再與b比較是否比b的值大,結果為真,所以a的值賦值給c。
我們稍微修改代碼,讓c成為unsigned。
#include <stdio.h>int main(void)
{int a = -1;unsigned int b = 1;unsigned int c = 0;c = a > b ? a : b; return 0;
}
這時候看到結果為
C語言中有符號整型變量把數據的最高位作為符號位使用,因此能表示數的正負;
無符號整型變量把數據的最高位最為數據位使用,因此不能表示負數。
?
(2)強制轉換
強制轉換格式為:(數據類型)(表達式)。
需要注意(int)x+y是先把x轉換成int型后再與y相加,而(int)(x+y)是把x和y相加的結果轉換成int型。
?
無論是自動轉換還是強制轉換,都只是為了本次運算的需要而對變量的數據長度進行的臨時性轉換,而不改變數據說明時對該變量定義的類型。