1.編譯器優化的問題
定義的局部變量如果後續沒有用,會被編譯器優化掉,如:
{
u32 va = 100;
va = 200;
//些處放斷點 ,查看一下va的值,會發現根本不對。
}
如何避免優化?
{
__IO u32 va = 100;
va = 200;
//此處放斷點,看一下值已經正常了。
}
__I 、__O 、 __IO的宏定義如下:
2. char類型會被當成unsigned char, 導致計算結果出錯
{
char va = -40;
//這裏放斷點,看一下va的值 如下:
}
這是因爲負數變成無符號數時,在內存中是其反碼+1
-40 二進制爲: 1010 1000
反碼爲: 1101 0111
補碼爲: 1101 1000 ——> 216
所以被當成是unsiged char 時會是216,顯然會導致計算出錯。
如何解決?
{
int8_t va = -40;
//放斷點看一下:
}
int8_t定義如下:
就是說申明char類型時,一定要寫成signed char 不然會被編譯器認爲是unsigned char
這點與我們在linux開發中是有區別的。