簡體   English   中英

為什么C編譯器會刪除我的&0xFF掩碼?

[英]Why is the C compiler dropping my &0xFF mask?

我有一個問題,其中2個不同的編譯器(GCC和IAR)從大小不同的if變量中刪除掩碼。

我有以下代碼:

uint8_t Value2;
uint16_t WriteOffset;
bool Fail;

void test(void)
{
        uint8_t buff[100];
        uint16_t r;

        for(r=0;r<Value2+1;r++)
        {
                if(buff[r]!=(WriteOffset+r)&0xFF)
                {
                        Fail=true;
                }
        }
}

buff[r] == 0且WriteOffset+r == 0x100時,if失敗(進入{}塊)。

GCC輸出以下程序集:

movzwl -0xc(%ebp),%eax                          ; Load 'r'->EAX
mov    -0x70(%ebp,%eax,1),%al                   ; Load 'buff[r]'->AL
movzbl %al,%edx                                 ; Move AL to (unsigned int)EDX
mov    0x4b19e0,%ax                             ; Load 'WriteOffset'->AX
movzwl %ax,%ecx                                 ; Move AX to (unsigned int)ECX
movzwl -0xc(%ebp),%eax                          ; Load 'r'->EAX
lea    (%ecx,%eax,1),%eax                       ; 'WriteOffset' + 'r'->EAX
cmp    %eax,%edx                                ; (unsigned int)'WriteOffset+r' == (unsigned int)'buff[r]'
je     0x445e28 <Test+1254>                     ; If == skip {} block

我的問題是,為什么編譯器會從if中刪除我的&0xFF (我已經通過強制轉換解決了問題,但我仍然不明白為什么它首先將其刪除了)?

不是, 運算符優先級在這里咬你

您想要if( buff[r] != ((WriteOffset+r)&0xFF) )

您當前擁有的內容與if( (buff[r]!=(WriteOffset+r)) & 0xFF )

優先級混淆導致您使用0xFF屏蔽只能為0或1(比較表達式的結果)的值,因此優化程序相當合理地刪除了它。

!=的優先級高於& 我認為您需要額外的括號。

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B有一個C / C ++運算符優先級表,請看一下。

運算符!=優先級高於& 所以你應該這樣寫:

 if(buff[r]!=((WriteOffset+r)&0xFF))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM