gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:53:04 29 4
gpt4 key购买 nike

我正在将一些 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) {

如果我关注 Microsoft's advice,这就是它的样子:

if ((j & (1i64 << k)) != 0) {

当代码将在 32 位和 64 位系统上编译时这样做是否安全?如果是这样,请解释为什么我必须在末尾添加“i64”,以及为什么这不会影响 32 位编译。否则,将不胜感激。

除此之外,我还有一些看起来更棘手的代码。

if (id[j] != id[j ^ (1u << k)]) {

我知道“u”表示该数字是无符号的,但是在不超过有符号最大值的值上指定它有什么意义......我猜这与位移?

最佳答案

1 具有根据 C++ 标准的 int 类型。在 64 位 Microsoft 编译器上,int 的 sizeof = 4 个字节,这意味着 int 是 32 位变量。 1i64 的类型为 __int64

当您使用移位运算符时,结果的类型与左操作数的类型相同。这意味着移动 1 你会得到 32 位的结果。 Microsoft 编译器假定它可能不是您所期望的(在 64 位平台上)并给您警告消息。

当您使用 1i64 时,两个平台上的结果都是 64 位的。 j0 将被隐式转换为 64 位。所以整个表达式将在 64 位变量中计算,结果将是 bool

所以使用 1i64 在两个 (32/64) 平台上都是安全的。

关于c++ - 在 C++ 中,1 和 1i64 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1264059/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com