C語言資料轉換問題

2021-07-05 09:56:45 字數 1724 閱讀 8272

不同的編譯器對資料轉換時的處理是不一樣的

下面來說下我在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型運算時,先...