这两者在位操作方面有啥区别?
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 > 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 << 24
的结果被截断为unsigned int
的大小,将结果赋值给uint32_t
则截断为uint32_t
的大小。如果我没看错,结果是一样的。
我认为你是对的,前提是最终结果确实因某种原因被截断为uint32_t
。我没有看到问题中指定的内容,因此我认为值得指出这一警告。【参考方案2】:
这两者的区别:
a >> 16
(a >> 16) & 0xff
是的,每个a > 0x00FFFFFF
都会得到不同的结果。
【讨论】:
【参考方案3】:a << 24
(a & 0xff)<<24
结果没有区别,但后者可以避免影响寄存器的溢出标志?
【讨论】:
以上是关于这两者在位操作方面有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章