我正在将一些 32 位兼容代码转换为 64 位 - 但我遇到了障碍。我正在编译 VS2008 x64 项目,并且收到以下警告:
warning C4334: '<<' : result of 32-bit shift implicitly converted to 64 bits
(was 64-bit shift intended?)
这是原始代码行:
if ((j & (1 << k)) != 0) {
如果我遵循的话,这就是它的样子微软的建议 http://msdn.microsoft.com/en-us/library/ke55d167.aspx:
if ((j & (1i64 << k)) != 0) {
当代码在 32 位和 64 位系统上编译时,这样做安全吗?如果是这样,请解释为什么我必须在末尾添加“i64”,以及为什么这不会影响 32 位编译。否则,我们将非常感谢解决方法。
除此之外,我还有一些看起来更棘手的代码。
if (id[j] != id[j ^ (1u << k)]) {
我知道“u”意味着该数字是无符号的,但是在不超过有符号最大值的值上指定这一点有什么意义......我猜这与位移位有关?
1
有类型int
根据 C++ 标准。在 64 位 Microsoft 编译器上int
sizeof = 4 字节,这意味着int
是32位变量。1i64
有类型__int64
.
当您使用移位运算符时,结果的类型与左操作数的类型相同。这意味着转移1
你会得到 32 位结果。 Microsoft 编译器假定它可能不是您所期望的(在 64 位平台上)并给出警告消息。
当你使用1i64
结果在两个平台上均为 64 位。j
and 0
将隐式转换为 64 位。因此整个表达式将在 64 位变量中计算,结果将是bool
.
所以使用1i64
在两个 (32/64) 平台上都是安全的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)