[英]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.