那两个关于位操作的区别是什么?

时间:2014-05-11 08:32:19

标签: c++ c visual-c++

比方说,a是无符号的32位整数。

a << 24
(a & 0xff)<<24

类似的,这两个的任何区别

a >> 16
(a >> 16) & 0xff

3 个答案:

答案 0 :(得分:4)

你的第一个例子:

a << 24
(a & 0xff)<<24

在32位无符号整数的情况下,结果没有区别。 从C标准(6.5.7按位移位运算符):

  

E1的结果&lt;&lt; E2是E1左移E2位位置;腾空   位用零填充。如果E1具有无符号类型,则值为   结果是E1×2 E2 ,比最大值减少一个模数   在结果类型中可表示。   (...)

你的第二个例子

a >> 16
(a >> 16) & 0xff

秒行将结果截断到0 .. 255范围,而第一行则不会。 如果你的意思是

之间的区别
a >> 16
(a >> 16) & 0xffff

那么无符号32位整数也没有区别:

  

E1&gt;的结果&gt; E2是E1右移E2位位置。如果E1有   无符号类型或E1具有带符号类型和非负值,   结果的值是E1 /的商的不可分割的一部分   2 E2 。   (...)

请注意,“无符号”在这里很重要。对于有符号整数,行为可以 是不同的,实现定义的或未定义的。

答案 1 :(得分:0)

这两者有何不同:

a >> 16
(a >> 16) & 0xff

是的,每个a > 0x00FFFFFF都会得到不同的结果。

答案 2 :(得分:0)

a << 24
(a & 0xff)<<24

结果之间没有区别,但后者可能会避免影响寄存器的溢出标志?