【发布时间】:2014-01-19 02:28:12
【问题描述】:
我基本上是在尝试做以下事情:
c[i] = ((number_to_store << pos) & 0xFF00000000) >> 32;
但这会将0 存储在c[i] 中,这不是预期的。下面的工作就像一个魅力:
c[i] = ((number_to_store << pos) & 0xFF000000) >> 24;
我 99% 确定该错误与我的所有变量都是 unsigned int 的事实有关,但这里我请求 40 位空间。
有人可以解释小于或等于32位和大于32位数字之间的区别,当它是关于位操作时?
编辑:这也给了我 0:
cout << ((((unsigned long)number_to_store << (unsigned long)pos) & (unsigned long)0xFF00000000) >> 32) << endl;
编辑2:以下作品:
cout << ((((unsigned long long)number_to_store << (unsigned long long)pos) & (unsigned long long)0xFF00000000) >> 32) << endl;
经验教训:永远不要期望 long 大于 int
【问题讨论】:
-
没有什么不同,你只是有更多的空间来处理。
-
有什么理由在
0xFF00000000末尾加上UL -
当心在某些尺寸下使用轮班而不是分隔...在某些平台上是undefined behavior。最值得注意的是,如果您使用
int移动超过 31 位,x86 和 x86-64 会做一些奇怪的事情。 -
感谢您指出这一点,您能解释一下吗?
-
@Luka 基本上使用 32 位 int,移动超过 31 位是未定义的行为。使用 64 位类型,移动超过 63 位是 UB。所以
c[i]应该是long long类型才能安全地移动32位。
标签: c++