Left-shifting 一个 uint64_t 清零最重要的双字
Left-shifting an uint64_t zeroes out most significant dword
标题总结:left-shifting和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
它是 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;
}
但你可能有也可能没有。
替换:
printf("%016x\n", var << 24);
与:
printf("%016llx\n", (var << 24));
还有,是uint_64还是uint64_t?
标题总结:left-shifting和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
它是 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;
}
但你可能有也可能没有。
替换:
printf("%016x\n", var << 24);
与:
printf("%016llx\n", (var << 24));
还有,是uint_64还是uint64_t?