在C++中,1和1i64有什么区别?

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)平台上使用都是安全的.

  • 1i64仅在MSVC平台上是安全的 - 其他编译器或标准不支持它. (2认同)