这两者在位操作方面有什么区别?

what's the difference between those two regarding bit operations?

本文关键字:什么 区别 方面 位操作      更新时间:2023-10-16

例如,a是一个无符号的32位整数。

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

相似的是,这两个有什么不同

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

您的第一个示例:

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

在32位无符号整数的情况下,结果没有差异。来自C标准(6.5.7位移位运算符(:

E1<lt;E2是E1左移位的E2比特位置;腾空的位用零填充。如果E1具有无符号类型,则结果是E1×2E2,比最大值多模1减少可在结果类型中表示。(…(

你的第二个例子

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

秒行将结果截断到0的范围。。255,而第一个没有。如果你的意思是之间的区别

a >> 16
(a >> 16) & 0xffff

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

E1>>E2的结果是E1右移E2位位置。如果E1无符号类型,或者如果E1具有有符号类型和非负值,结果的值是E1商的积分部分/2E2。(…(

请注意,"unsigned"在这里很重要。对于有符号整数,行为可以不同、实现定义或未定义。

这两者的任何区别:

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

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

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

结果之间没有差异,但后者可以避免影响寄存器的溢出标志?