1. 程式人生 > >C語言開發筆記(一)自動轉換和強制轉換

C語言開發筆記(一)自動轉換和強制轉換

        整型資料和實行資料之間可以進行運算,而且字元型資料可以和整型資料通用,所以整型、實型、字元型資料之間也是可以進行運算的,但在運算處理之前,不同型別的資料要事先轉換成同一種資料型別。轉換方法有兩種:自動轉換和強制轉換。

(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,其值即為2^{32}-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;
}

這時候看到結果為

(2)強制轉換

強制轉換格式為:(資料型別)(表示式)。

需要注意(int)x+y是先把x轉換成int型後再與y相加,而(int)(x+y)是把x和y相加的結果轉換成int型。

無論是自動轉換還是強制轉換,都只是為了本次運算的需要而對變數的資料長度進行的臨時性轉換,而不改變資料說明時對該變數定義的型別。