Nic*_*ton 20 c++ 64-bit bit-shift
我正在将一些32位兼容代码转换为64位 - 我遇到了麻烦.我正在编译VS2008 x64项目,我收到此警告:
warning C4334: '<<' : result of 32-bit shift implicitly converted to 64 bits
(was 64-bit shift intended?)
Run Code Online (Sandbox Code Playgroud)
这是原始的代码行:
if ((j & (1 << k)) != 0) {
Run Code Online (Sandbox Code Playgroud)
如果我遵循微软的建议,这就是它的样子:
if ((j & (1i64 << k)) != 0) {
Run Code Online (Sandbox Code Playgroud)
当代码将在32位和64位系统上编译时,这样做是否安全?如果是这样,请解释为什么我必须添加"i64"到底,以及为什么这不会影响32位编译.否则,将非常感谢解决方案.
除此之外,我看起来像是一个更棘手的代码.
if (id[j] != id[j ^ (1u << k)]) {
Run Code Online (Sandbox Code Playgroud)
我理解"u"意味着数字是无符号的,但是在一个不超过有符号最大值的值上指定的是什么......我猜这与位移有关?
Kir*_*sky 11
1具有int符合C++标准的类型.在64位Microsoft编译器的intsizeof = 4字节,这意味着int是32位变量.1i64有类型__int64.
使用shift运算符时,结果的类型与左操作数的类型相同.这意味着1你将获得32位的结果.Microsoft编译器假定它可能不是您期望的(在64位平台上),并为您提供警告消息.
使用1i64结果时,两个平台上的结果都是64位.j并将0隐式地转换为64位.因此整个表达式将以64位变量计算,结果将是bool.
因此1i64在两个(32/64)平台上使用都是安全的.
| 归档时间: |
|
| 查看次数: |
8378 次 |
| 最近记录: |