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

标签 c bit-manipulation

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

目前我正在这样做:

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

打印这表明第 14 位正在设置。我什至无法设置第 32 位。如果我设置第 32 位,它会设置第 0 位。33 将设置第 1 位。看起来它在 0- 之后进行循环移位31 再次从 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);}

最佳答案

如果您使用类型作为 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 类型。

关于c - 如何在 64 位寄存器字段中设置第 45 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9207611/

相关文章:

c - 当我尝试运行提取的 shellcode 时出现段错误,即使没有 null

c - 为什么输出后多了一个百分号?

java - 16位偏移和24位偏移是什么意思?我如何使用java进行这样的计算

c - fscanf 命令中标记前的预期主表达式

c++ - 哪个维基解析器?

c - 为什么不能使用复合文字来分配已定义的固定大小的数组?

c 按位取反转换题

c - C语言中的(1<<OCIE0A)是什么?

c - 在 C 中设置和清除位

c++ - 在 bool 值上使用按位非运算符 (~) 是否会调用未定义的行为?