乙個型別轉換的討論

2021-07-05 09:41:03 字數 804 閱讀 4278

unsigned

char port = 0x5a;

unsigned

char result_8;

result_8 = (~port)>>4;

在網上參考的文章,在arm下。(~port)運算時,port會提公升為int型,運算結果result_8 = 0xfa;

實際上,在iar程式設計環境中,當所選處理器架構為arm7時result_8 = 0xfa;當處理器架構為cortex-m3時result_8時result_8 = 0x0a;

對於第一種結果,(四十八)解釋:當出現在表示式裡時,有符號和無符號的char和short型別都將自動被轉換為int型別。

對於第二種情況,彙編**如下所示

movsr0,#90

ubfx r2,r0,#4,#4

eros.wr2,r2,#15

uxtbr2,r2

movs r1,r2

ubfx r2,r0,#4,#4指令後r0=0x00000005;

eros.wr2,r2,#15 指令之後r2 = 0x0000000a;

其中ubfx為無符號位提取指令

ubfx.w   rd,rn,#lsb,#width
從rn中提取從lsb開始width寬度的位數。

ero 為按位異或指令

eor

.wrd,rn,#imm12

=>rd = rn ^imm12

不知出現這種情況,望了解的人解釋下。

乙個型別轉換的bug

int a 10 unsigned int b 5 if a b else 有經驗的人一看上面的 就知道有問題,會讓int型降為unsigned int,結果會是列印出 big 因為 10轉成unsigned int肯定比5大多了。雖然是個小bug,卻是第一次撞上,因為我以前如果拿變數做計數,通常是...

討論乙個堆疊越界的問題

我們先看乙個linux下的c 分析一下執行結果 1 int main int argc,char ar 4 for i 3 i 8 return 0 9 顯然,由於陣列越界導致行為未知?其實,行為雖然非法,但並不是未知或者因為非法訪問而退出。我們知道,在 c 語言中,只要不是訪問受限的記憶體,所有的...

討論乙個堆疊越界的問題

我們先看乙個linux下的c 分析一下執行結果 1 int main int argc,char ar 4 for i 3 i 8 return 0 9 顯然,由於陣列越界導致行為未知?其實,行為雖然非法,但並不是未知或者因為非法訪問而退出。我們知道,在 c 語言中,只要不是訪問受限的記憶體,所有的...