不同的編譯器對資料轉換時的處理是不一樣的
下面來說下我在pic16f1783微控制器上遇到的資料轉換問題
微控制器 : pic16f1783
ide : mplab
編譯器 :hi-tech ansi c compiler (picc)
1.以下是程式小片段,做a+b的運算
u32 sum;
//用於存放結果
u16 a = 0xffff;
u16 b = 0xffff;
sum = a + b;
結果:sum = 0xfffe
u32 a = 0xffff;
u16 b = 0xffff;
sum = a + b;
結果:sum = 0x1fffe
u16 a = 0xffff;
u32 b = 0xffff;
sum = a + b;
結果:sum = 0x1fffe
u32 a = 0xffff;
u32 b = 0xffff;
sum = a + b;
結果:sum = 0x1fffe
根據上面的4個情況,輸出的不同結果可以說明,編譯器運算時往型別大的方向轉換,
結果的最大型別不能超過被運算值的類天天型。
2.以下是程式小片段,做a+b的運算(stm32 keil ide 編譯器)
u32 sum;
//用於存放結果
u16 a = 0xffff;
u16 b = 0xffff;
sum = a + b;
結果:sum = 0x1fffe
u32 a = 0xffff;
u16 b = 0xffff;
sum = a + b;
結果:sum = 0x1fffe
u16 a = 0xffff;
u32 b = 0xffff;
sum = a + b;
結果:sum = 0x1fffe
u32 a = 0xffff;
u32 b = 0xffff;
sum = a + b;
結果:sum = 0x1fffe
根據上面的4個情況,輸出的結果可以說明,編譯器運算時往型別大的方向轉換,
結果的最大型別可以超過被運算值的型別。
3.以下是程式小片段,做a+b的運算(vs2013)
u32 sum;
//用於存放結果
u16 a = 0xffff;
u16 b = 0xffff;
sum = a + b;
結果:sum = 0x1fffe
u32 a = 0xffff;
u16 b = 0xffff;
sum = a + b;
結果:sum = 0x1fffe
u16 a = 0xffff;
u32 b = 0xffff;
sum = a + b;
結果:sum = 0x1fffe
u32 a = 0xffff;
u32 b = 0xffff;
sum = a + b;
結果:sum = 0x1fffe
根據上面的4個情況,輸出的結果可以說明,編譯器運算時往型別大的方向轉換,
結果的最大型別可以超過被運算值的型別。
綜合上面三個編譯器進行分析,可以得出結論,不同的編譯器對資料處理時存在不同的處理方法。
C語言資料轉換
在32位機器中,所有低於32的整形資料,在運算過程中先要轉化為32位的整形資料,然後才參與運算 1.如果其中乙個變數是 long double 型別,則另乙個變數轉換為 long double型別 2.如果乙個變數是 double 型別,則另乙個變數轉換為 double 型別 3.如果乙個變數是 f...
C語言資料型別轉換
自動轉換發生在不同資料型別的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。所有的浮點運算都是以雙精度進行的,即使僅...
C語言資料型別轉換
變數的資料型別是可以轉換的。轉換的方法有兩種,一種是自動轉換,一種是強制轉換。自動轉換發生在不同資料型別的量混合運算時,由編譯系統自動完成。自動轉換遵循以下規則 若參與運算量的型別不同,則先轉換成同一型別,然後進行運算。轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先...