C語言資料轉換

2021-10-18 16:28:54 字數 2168 閱讀 1279

在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 )

;//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、大範圍空間的資料,賦值給小範圍空間的資料,會發生截斷,導致資料精度丟失

C語言資料轉換問題

不同的編譯器對資料轉換時的處理是不一樣的 下面來說下我在pic16f1783微控制器上遇到的資料轉換問題 微控制器 pic16f1783 ide mplab 編譯器 hi tech ansi c compiler picc 1.以下是程式小片段,做a b的運算 u32 sum 用於存放結果 u16 ...

C語言資料型別轉換

自動轉換發生在不同資料型別的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。所有的浮點運算都是以雙精度進行的,即使僅...

C語言資料型別轉換

變數的資料型別是可以轉換的。轉換的方法有兩種,一種是自動轉換,一種是強制轉換。自動轉換發生在不同資料型別的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先...