如何在C中执行64位左移

时间:2017-05-25 10:39:04

标签: c uint64

我正在尝试将两个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位不起作用,我怎么办呢?

4 个答案:

答案 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");
}