左移uint64_t将最重要的dword清零

时间:2016-10-14 14:44:23

标签: c 64-bit x86-64 bit-shift stdint

标题总结了:左移uint64_t并没有输出预期值,我想知道原因。我得到的是预期的结果,其中4个最重要的字节被清零。 我在Debian Jessie 64bit上使用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

2 个答案:

答案 0 :(得分:3)

<input>,您需要uint64_t

的其他类型
printf

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

#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;
}

但你可能有也可能没有。

答案 1 :(得分:1)

替换:

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

使用:

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

另外,是uint_64还是uint64_t?