1. 程式人生 > 其它 >C語言資料轉換

C語言資料轉換

技術標籤:c語言

C語言資料型別轉換與隱形資料提升

隱形轉化

整形提升

在32位機器中,所有低於32的整形資料,在運算過程中先要轉化為32位的整形資料,然後才參與運算:

混合提升規則:

1.如果其中一個變數是 long double 型別,則另一個變數轉換為 long double型別;
2.如果一個變數是 double 型別,則另一個變數轉換為 double 型別;
3. 如果一個變數是 float 型別,則另一個變數轉換為 float 型別;
4. 如果一個變數是 unsigned int 型別,則另一個變數轉換為 unsigned int 型別;
5. 如果兩個兩邊不是 int 型別,則兩個變數執行整形提升;

細節說明在這裡插入圖片描述

1.當有多種型別的資料混合運算時,系統首先自動將所有的資料轉換成精度最大的那種資料型別,然後再進行計算。(如 int 型和 short 型運算時,先把 short 型轉換成 int 型後再進行計算)
2.若兩種型別的位元組數不同,轉換成位元組數大的型別,若兩種型別的位元組數相同,且一種有符號,一種無符號,則轉換成無符號型。
3.在賦值運算中,賦值號兩邊的資料型別不同時,賦值號右邊的型別將轉換為左邊的型別,如果右邊的資料型別長度比左邊長時,將丟失一部分資料,這樣會降低精度。

例子

char a=-1;
signed char b=-1;
unsigned char c=-1;
printf
("a=%d b=%d c=%d\n",a,b,c); //char a=-1,char 為有符號型別,發生整形提升時高位補符號位 //10000000 00000000 00000000 00000001 -->-1的原碼 //11111111 11111111 11111111 11111110 -->-1的反碼 //11111111 11111111 11111111 11111111 -->-1的補碼 //11111111 -->char a char為一個位元組,產生資料階段,由32位截斷為8位,高位捨棄 //11111111 11111111 11111111 11111111 -->列印時為有符號的整形,資料整形提升,此時為補碼
//11111111 11111111 11111111 11111111 -->反碼 //10000000 00000000 00000000 00000001 -->原碼 結果為-1, //unsigned char c=-1 ,unsigned char 為無符號型別,發生整形提升時,高位補0 //00000000 00000000 00000000 11111111 -->無符號數的原碼、反碼、補碼相同,結果為255

a 為有符號的char型別,列印時為有符號的整數型別,char型別需要提升為int型別,再進行列印,提升過程見上面程式碼。

//這個程式列印什麼
unsigned int a =1;
int b= -100;
if(a+b >a)
	printf("a+b >a\n");
else
	printf("a+b <a\n");
//00000000 00000000 00000000 00000001 -->a的值(無符號型別,原碼、反碼、補碼相同)

//10000000 00000000 00000000 01100100  --> -100 的原碼
//11111111 11111111 11111111 10011011  --> -100 的反碼
//11111111 11111111 11111111 10011100 -->  -100 的補碼,無符號下的值為4,294,967,196

//所以輸出的結果為  a+b > a!!!

結論

在涉及到 char 、unsigned char、short、int、unsigned int型別的計算時,要注意型別提升的相關問題,根據整體提升規則進行計算。
1、小範圍空間的資料,賦值給大範圍空間的資料,系統為了保證資料的完整性,提供了符號擴充機制,要麼擴充0,要麼擴充1,無符號型別提升時,擴充0。
2、大範圍空間的資料,賦值給小範圍空間的資料,會發生截斷,導致資料精度丟失
在這裡插入圖片描述