0

标题总结了它:左移 uint64_t 不会输出预期值,我想知道为什么。我得到的是预期的结果,它的 4 个最重要的字节被清零。我在 Debian Jessie 64 位上使用 x86_64 CPU (Intel i7 3770k)。这是一个重现相同行为的测试程序。

#include <stdio.h>
#include <stdint.h>

int main(int argc, char * * argv)
{
    uint64_t var = 0xDEFEC8ED;

    printf("%016x\n", var << 24);

    return 0;
}

输出 00defec8ed000000 // expected 00000000ed000000 // obtained

4

2 回答 2

3

它是uint64_t,你需要一个不同的类型printf

#include <stdio.h>
#include <stdint.h>

int main(int argc, char * * argv)
{
    uint64_t var = 0xDEFEC8ED;

    printf("%016llx\n", (unsigned long long)(var << 24));

    return 0;
}

这并不完全正确,因为自 C99 以来就有用于打印这些类型的特殊宏:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(int argc, char * * argv)
{
    uint64_t var = 0xDEFEC8ED;

    printf("%016" PRIX64 "\n", var << 24);

    return 0;
}

但你可能拥有也可能没有。

于 2016-10-14T14:51:55.677 回答
1

代替:

printf("%016x\n", var << 24);

和:

printf("%016llx\n", (var << 24));

另外,它是 uint_64 还是 uint64_t ?

于 2016-10-14T14:52:37.553 回答