如何在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");
}
我正在尝试将两个 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");
}