【问题标题】:NOT of 64 bit number giving wrong results in cNOT 的 64 位数字在 c 中给出错误的结果
【发布时间】:2013-06-18 18:50:51
【问题描述】:

有两个数字 a 和 b,都是 64 位。

代码:

a = a|b;

如果(!(a&b)){ }

现在在上面的场景中,b 的第 34 位是开启的,而 a 有一些位开启。 因此,根据情况 !(a&b) 应该导致 0 但代码进入了错误的 if 循环。问题是 !(a&b) 给出的是 1 而不是 0。有什么原因吗?

【问题讨论】:

  • a = a|b; 之后你有(a&b) == b。所以我看到了三种可能性:1)b 为 0,与您的想法相反,2)您的实际代码不同,3)编译器有问题。
  • b = 1
  • 啊,但是1 << 33 换了一个int。如果 int 像往常一样是 32 位宽,这是未定义的行为,并且可能导致 b 为 0(如果 1 << 33 在源代码中出现,gcc 会这样做;在编译时评估移位时间,然后掩码为 32 位)。请改用1ull << 33
  • 实际上 b = 1ull
  • 您能否提供重现该问题的示例代码,这将有助于减少猜测。

标签: c 64-bit bit-manipulation bit-shift


【解决方案1】:

既然你不想做SSCE,我就给你做了一个:

#include <stdio.h>

int main(void) {
    unsigned long long a = 42, b = 1ULL << 33;

    a = a|b;
    if(!(a&b))
        printf("!(a&b)\n");
    else
        printf("(a&b)\n");

    return 0;
}

并在ideone 运行它。它按预期输出(a&amp;b)。您的问题不在您向我们展示的代码中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 2017-09-21
    • 1970-01-01
    相关资源
    最近更新 更多