C 如何在64位寄存器字段中设置第45位?

C 如何在64位寄存器字段中设置第45位?,c,bit-manipulation,C,Bit Manipulation,我试图用C设置64位宽寄存器中的第46位。如何设置这个位 目前我正在这样做: uint32_t= address ; uint64_t data =1ULL << 46; uint32\u t=地址; uint64\u t data=1all您的代码是正确的 您应该检查您的平台是否正确支持64位整数类型: printf("%zu %zu\n", sizeof 1ULL, sizeof data); 应该打印 8 8 如果是这种情况,那么错误可能是(正如@pmg在注释中提到的)您

我试图用C设置64位宽寄存器中的第46位。如何设置这个位

目前我正在这样做:

uint32_t= address ;
uint64_t data =1ULL << 46;
uint32\u t=地址;
uint64\u t data=1all您的代码是正确的

您应该检查您的平台是否正确支持64位整数类型:

printf("%zu %zu\n", sizeof 1ULL, sizeof data);
应该打印

8 8
如果是这种情况,那么错误可能是(正如@pmg在注释中提到的)您如何检查位是否被设置

在新编辑中,您提到它是一个寄存器。由于IO寄存器的易失性,它们可能具有特殊的行为。我建议您首先检查设置普通对象的位。

您的代码是正确的

您应该检查您的平台是否正确支持64位整数类型:

printf("%zu %zu\n", sizeof 1ULL, sizeof data);
应该打印

8 8
如果是这种情况,那么错误可能是(正如@pmg在注释中提到的)您如何检查位是否被设置


在新编辑中,您提到它是一个寄存器。由于IO寄存器的易失性,它们可能具有特殊的行为。我建议您首先检查设置一个普通对象的位。

我希望您不要检查这一行的输出以得出换档不正确的结论

printf(标准输出,“在地址%x=%llx\n启用编程”,注册表地址val,注册表地址val)

将64位值传递两次到
printf
,但使用%x(可能是32位)和%llx(64位)输出值将不起作用。我猜您是想在第一个参数中获取reg_addr.val的地址

printf(标准输出,“在地址%x=%llx\n处启用编程,®\u addr.val,reg\u addr.val)


我希望您不要检查这条线的输出,以得出换档不正确的结论

printf(标准输出,“在地址%x=%llx\n启用编程”,注册表地址val,注册表地址val)

将64位值传递两次到
printf
,但使用%x(可能是32位)和%llx(64位)输出值将不起作用。我猜您是想在第一个参数中获取reg_addr.val的地址

printf(标准输出,“在地址%x=%llx\n处启用编程,®\u addr.val,reg\u addr.val)


如果将类型用作uint32\u t或uint64\u t,则正确打印是通过以下方式完成的:

printf(stdout, "Programming enable at address %" PRIu32 "=%" PRIu64 "\n",reg_addr.addr, reg_addr.val);

假设reg_addr.addr为uint32_t类型,reg_addr.val为uint64_t类型。

如果将类型用作uint32_t或uint64_t,则正确打印是通过以下方式完成的:

printf(stdout, "Programming enable at address %" PRIu32 "=%" PRIu64 "\n",reg_addr.addr, reg_addr.val);

假设ReGyAdRAD.ADDR是UTIT32×T型,类型ReGyAdR.Var是UIT64 64 t。

@ Tyj.No不是,你已经问了8个问题,其中有5个你应该考虑什么是你收到的最好答案。你的编译器看起来很笨拙。尝试<代码>(1UL)你能显示完整的例子吗?因为移位是正确的。你如何检查比特是什么?我正在读取登记值。@ Thj.No你不是,你问了8个问题,其中5个你应该考虑什么是你收到的最好答案。你的编译器看起来很笨拙。试试<代码>(1您能给出一个完整的示例吗?因为移位是正确的。您如何检查位的设置?我正在读取寄存器值。我有一个函数,它从设备读取数据,并以这种格式保存(unsigned char*)&数据。此数据值是我正在读取和打印的数据,此数据被声明为uint64。我有一个函数从设备读取数据,并以此格式保存(未签名字符*)&数据。此数据值是我正在读取和打印的数据,此数据声明为uint64\t