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

时间:2012-02-09 08:39:39

标签: c bit-manipulation

我试图在64位宽的寄存器中设置第46位使用C.我该如何设置这个位?

目前我这样做:

uint32_t= address ;
uint64_t data =1ULL << 46;

打印显示第14位正在设置。我无法设置第32位。如果我将第32位设置为第0位.33将设置第1位。看起来它在0后进行循环移位再一次,它从0开始。

以64位宽注册。

我知道如何设置这个位?

例如:

reg_addr.val = FEATURE_REG;

printf(stdout, "Programming enable at address %x=%llx\n",
    reg_addr.val,reg_addr.val);

data.val = (1ULL << 46);

printf("Data value %llx\n",data.val);}

3 个答案:

答案 0 :(得分:2)

如果使用类型为uint32_t或uint64_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。

答案 1 :(得分:1)

您的代码是正确的。

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

printf("%zu %zu\n", sizeof 1ULL, sizeof data);

应该打印

8 8

如果是这种情况,那么错误可能(如评论中的@pmg所述)检查该位是否已设置。

在新的编辑中,你提到它是一个寄存器。 IO寄存器由于其volatile属性而具有特殊行为。我建议你先检查一下是否有正常的物体。

答案 2 :(得分:0)

我希望你不检查这一行的输出,以断定转换没有正确完成!?

  

printf(stdout,“地址%x =%llx \ n”编程启用“,reg_addr.val,reg_addr.val);

将64位值传递给printf两次,但使用%x(可能是32位)和%llx(64位)输出值将不起作用。我想你的意思是在第一个参数上取reg_addr.val的地址!?

  

printf(stdout,“编程启用地址%x =%llx \ n”,&amp; reg_addr.val,reg_addr.val);