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 語言中,只要不是訪問受限的記憶體,所有的...