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

Posted

技术标签:

【中文标题】这两者在位操作方面有啥区别?【英文标题】:what's the difference between those two regarding bit operations?这两者在位操作方面有什么区别? 【发布时间】:2014-05-11 08:32:19 【问题描述】:

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

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

一个相似,这两个有什么不同

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

【问题讨论】:

第二个仅移动 a 的 LSB。它们完全不同! 第二个会为a &gt; 0x00FFFFFF 产生不同的结果。 【参考方案1】:

你的第一个例子:

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

对于 32 位无符号整数,结果没有区别。 来自 C 标准(6.5.7 位移位运算符):

E1 E2,比最大值多模一 可在结果类型中表示。 (...)

你的第二个例子

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

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

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

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

E1 >> E2 的结果是 E1 右移 E2 位位置。如果 E1 有 一个无符号类型,或者如果 E1 有一个有符号类型和一个非负值, 结果的值是 E1 / 商的整数部分 2E2。 (...)

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

【讨论】:

如果这个系统上的unsigned int大于32位怎么办? 那么a &lt;&lt; 24的结果被截断为unsigned int的大小,将结果赋值给uint32_t则截断为uint32_t的大小。如果我没看错,结果是一样的。 我认为你是对的,前提是最终结果确实因某种原因被截断为uint32_t。我没有看到问题中指定的内容,因此我认为值得指出这一警告。【参考方案2】:

这两者的区别:

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

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

【讨论】:

【参考方案3】:
a << 24
(a & 0xff)<<24

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

【讨论】:

以上是关于这两者在位操作方面有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

BIT(BOOL)、BYTE、WORD、DWORD,这四个类型数据在位数上有啥区别

32位和64位有啥区别 32位和64位区别都有哪些

系统调用和库调用有啥区别?

这两者有啥区别? [复制]

位运算————两整数之和

在位向量算术的决策过程中使用术语重写