在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型運算時,先...