Esempio:
int c = 4;
int p = 5;
if (p & (1 << c))
printf("ok\n");
else
printf("nop\n");
gcc -S:
movl -4(%rbp), %eax /* eax holds the variable c */
movl -8(%rbp), %edx /* and edx holds p */
movl %eax, %ecx /* tmp(ecx) = c */
sarl %cl, %edx /* edx(p) >>= c */
movl %edx, %eax /* eax = p shifted right by c */
andl $1, %eax /* eax(p shifted right by c) &= 1 */
testl %eax, %eax /* test if p is 0 */
... jumps and such ...
Come puoi vedere, GCC per qualche ragione ha convertito il mio codice in:
p >>= c;
p &= 1
if (p != 0)
...
else
...
Qualcosa di strano sta succedendo qui o mi manca qualcosa ... Ha fatto l'operazione all'indietro, anche se avevo parentesi attorno al 1 << c
quindi avrebbe dovuto farlo separatamente E AND con p
corretto?
Qualcuno può spiegare perché GCC ha fatto questo? È una sorta di ottimizzazione (non ho abilitato l'ottimizzazione quando ho compilato questo, quindi ne dubito) O è come dovrebbe essere fatto in assembly?