我正在尝试将两个32位值复制到一个64位地址中。 一个DWORD是高32位,第二个是低32位。 我尝试了以下操作,但64位值中的移位操作数不起作用:
UINT64 a = 0x12341234;
UINT64 b = 0x00003800;
我需要的价值是: 0x0000380012341234
所以我做了:
printf("b 0x%016x\n", b);
b = ((UINT64)b) << 20;
printf("b 0x%016x\n", b);
和我得到的照片:
b 0x0000000000003800
b 0x0000000080000000
我试图转移到不同的数字(10和10再次,或32或0x20),但没有任何对我有用。
为什么转移到UINT64的高32位不起作用,我怎么办呢?
答案 0 :(得分:3)
您的格式说明符告诉printf
该参数是正常的(可能是32位)int
因此它会切断前32位(因为您的计算机必须是小端)。
您可以使用%llx
,但如果是这样,我也很想将参数转换为unsigned long long
。
printf("b 0x%016llx\n", (unsigned long long)b);
C11还在inttypes.h
中定义了一些固定宽度格式说明符,以便在没有强制转换的情况下使其安全 - PRIx64
是您需要的。{/ p>
答案 1 :(得分:2)
它唯一的printf()类型问题。我试过它工作正常。
#include <stdio.h>
#include <stdlib.h>
#define UINT64 unsigned long long
int main()
{
UINT64 a = 0x12341234;
UINT64 b = 0x00003800;
printf("b 0x%016llx\n", (unsigned long long)b);
b = ((UINT64)b) << 32;
printf("b 0x%016llx\n",(unsigned long long) b);
system("pause");
}
希望它有所帮助。 :)
答案 2 :(得分:0)
您可以将常量强制转换为unsigned long long
,但也可以告诉词法分析者直接unsigned long long
printf("%x\n", 0xnnnnnnnnULL);
在这种情况下,词法分析器将生成类型为整数的c-lexeme,其类型为unsigned long long
,无需强制转换。
答案 3 :(得分:0)
要添加到Vishwajeet的帖子,当然应该添加一个:
#include <stdio.h>
#include <stdlib.h>
#define UINT64 unsigned long long
int main()
{
UINT64 a = 0x12341234;
UINT64 b = 0x00003800;
printf("b 0x%016llx\n", (unsigned long long)b);
b <<= 32;
b += a;
printf("b 0x%016llx\n",(unsigned long long) b);
system("pause");
}