運算子優先順序引發的血案

2021-09-28 17:01:12 字數 1126 閱讀 3400

案例:

比如我希望對乙個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 ...