如何在C中执行64位左移

How to perform shift left of 64bit in C

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

您的格式说明符告诉 printf 该参数是一个普通参数(可能是 32 位)int 因此它会切断前 32 位(因为您的计算机必须是小端)。

您可以使用 %llx,但如果是这样,我很想也将参数转换为 unsigned long long

printf("b 0x%016llx\n", (unsigned long long)b);

C11 还在 inttypes.h 中定义了一些固定宽度的格式说明符,以使其在没有转换的情况下安全 - PRIx64 是您需要的。

它只是 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");
}

希望对您有所帮助。 :)

您可以将常量转换为 unsigned long long,但您也可以告诉词法分析器直接 unsigned long long 那样

printf("%x\n", 0xnnnnnnnnULL);

在这种情况下,词法分析器将生成一个整数类型的 c-lexeme,类型为 unsigned long long,无需转换。

要添加到 Vishwajeet 的 post,当然应该添加:

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