在下面的代码中是分配所需的掩码..

unsigned int x = 0x01020304;
unsigned char a1, a2, a3, a4;

a1 = (x >> 24) & 0xff;
a2 = (x >> 16) & 0xff;
a3 = (x >> 8) & 0xff;
a4 = x & 0xff ;

我确实意识到没有它它也能很好地工作,但我发现所有标准/审查代码中都有这种分配......这不是浪费周期吗??

感谢您对上述代码的回应,似乎编译器忽略(优化)了掩码,如下面的 objdump 所示。
a1 = (x >> 24) & 0xff;
804838b:    8b 45 fc                mov    0xfffffffc(%ebp),%eax
804838e:    c1 e8 18                shr    $0x18,%eax
8048391:    88 45 fb                mov    %al,0xfffffffb(%ebp)

最佳答案

我喜欢屏蔽代码,因为它清楚地表达了作者的意图,即只保留每个操作的最后 8 位。编译器能够对其进行优化(在字节恰好为 8 位的平台上),而在其他平台上,无论如何都需要屏蔽。

关于c - 在这种情况下是否需要屏蔽?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8162622/

10-11 21:12