案例:
比如我希望對乙個23bit的字段進行單位元組分離,如:
typedef struct _aaaaaa;
希望對b這個域,做單位元組分離,有問題的**如下:
uint8_t buf[17] = ;
memset(buf, 0, sizeof(buf));
buf[0] |= (uint8_t) ((aaa.a & 0x1) << 7);
buf[0] |= (uint8_t) (aaa.b & 0x7f0000) >> 16;
buf[1] |= (uint8_t) (aaa.b & 0x00ff00) >> 8;
buf[2] |= (uint8_t) (aaa.b & 0x0000ff);
不關注**本身的可編譯性,各位看官能看出問題在哪麼?ta da:
解析如下:
問題出在buf[1]
處,原因是運算子的優先順序問題導致的,在這段**的結合中,
(uint8_t) (aaa.b & 0x00ff00) >> 8;
,(aaa.b & 0x00ff00)
是和(uint8_t)
優先結合的,然後再執行>>8
這個動作。那麼如果我的aaa.b的值假如是0x3e7,那麼(aaa.b & 0x00ff00)
的結果是0x000300
,此時強轉(uint8_t)
,只取1b,得到的結果是0x0
,再右移8bit,結果還是0;並非我們想要的0x03
,所以資料就會出錯;
修改方法:
取值後先右移,最後再強轉,即(uint8_t) ((aaa.b & 0x00ff00) >> 8)
,這樣右移後資料為0x03
,強轉也是0x03
;
其他大於1個位元組的處理,如果沒有加括號,都會有類似的問題。
附上運算子的優先順序:
Verilog 運算子優先順序引發的血案
今天翻譯matlab 時需要用移位和加法實現乘法,發現乙個非常奇怪的問題 需要計算的是 x 3 a,將a左移一位與a相加,verilog 如下 x a a 1 出來的結果 x 4 a,如果 為 x a 1 a 結果為 x 0。曉明同學告訴我,要加括號才可以,因為優先順序問題,算術操作符優先順序高於移...
運算子優先順序引發的bug
這個錯誤也是好久前的了.錯誤描述 在乙個程式中,我想判斷乙個暫存器與 上 1 17 後是否等於0,如下 if io0set 1 17 0 這樣寫其實是得不到正確的結果的,因為我忽略了 的優先順序是大於 的.按照上面的 分析 因為 的優先順序大於 所以程式先判斷 1 17 是否等於0?發現這是不相等的...
運算子優先順序 C 運算子優先順序
c 運算子優先順序 優先順序運算子 描述方向1 scope resolution 範圍解析 left to right 2 suffix postfix increment and decrement 字首 字尾遞增和遞減 function call 函式呼叫 array subscripting ...