我试图在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);}
答案 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);