在这种情况下是否需要屏蔽?

时间:2011-11-17 05:39:17

标签: c optimization masking

在下面的代码中是赋值所需的掩码..

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)

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这样做更安全。想象一下如果将a1更改为int会发生什么。 它不应该慢,因为编译器知道转换为char会涉及掩盖几个位。

有趣的是,0xff可能并不总是正确的掩码 - 来自UCHAR_MAX的{​​{1}}将与平台无关。

答案 2 :(得分:0)

出于所有实际目的,没有面具你就没事了。但根据规范,您需要掩码,因为char的实际大小取决于体系结构,在这种情况下,我认为您应该希望它的大小至少为8位(同样,不能保证,基于体系结构)。

不,我不能引用任何不使用8位字节的现代机器(因此称为“所有实用目的”免责声明)。但过去许多旧机器肯定没有。

答案 3 :(得分:-2)

对于大多数具有8位字符的系统,屏蔽是不必要的,并且视觉上很难看,但它对生成的代码没有任何影响,除非您的编译器无法执行任何优化。如果CHAR_BIT>8,那么显式屏蔽是获得所需行为所必需的。

答案 4 :(得分:-2)

是的 - 通过已经完成的转换,将代码展开一点,看起来像这样。

a1=0x01 & 0xff // ok not really needed here
a2=0x0102 & 0xff // needed here because I just want the 02 from the hex
a3=0x010304 & 0xff // needed here because I just want the 04 from the hex
a4=0x01020405 & 0xff // needed again because I just want the 05 from the hex