我创建了一个表示虚拟内存的数组,并且对此数组有一个uint8_t *。我试图一次访问64位,并将其设置为一个值。它只接受第一个字节,我无法弄清楚如何使它占用整个64位。
control->value = memory[pc + 2];
我知道这会将控制值设置为pc + 2的存储器阵列(64位的开头我想读入)
我只是不知道如何让这些代码以64位进入控制 - > value(a uint64_t)
答案 0 :(得分:3)
最干净的方法是一次读取一个字节,然后移动并将值移入。
如果MSB是第一个:
control->value = (uint64_t)memory[pc + 2] << 56;
control->value |= (uint64_t)memory[pc + 3] << 48;
control->value |= (uint64_t)memory[pc + 4] << 40;
control->value |= (uint64_t)memory[pc + 5] << 32;
control->value |= (uint64_t)memory[pc + 6] << 24;
control->value |= (uint64_t)memory[pc + 7] << 16;
control->value |= (uint64_t)memory[pc + 8] << 8;
control->value |= (uint64_t)memory[pc + 9];
如果LSB是第一个:
control->value = (uint64_t)memory[pc + 2];
control->value |= (uint64_t)memory[pc + 3] << 8;
control->value |= (uint64_t)memory[pc + 4] << 16;
control->value |= (uint64_t)memory[pc + 5] << 24;
control->value |= (uint64_t)memory[pc + 6] << 32;
control->value |= (uint64_t)memory[pc + 7] << 40;
control->value |= (uint64_t)memory[pc + 8] << 48;
control->value |= (uint64_t)memory[pc + 9] << 56;
铸造是必要的,以确保左移不会脱离边缘&#34;
答案 1 :(得分:0)
如下所示,您可以使用uint8_t*
int main()
{
uint64_t value = 100000000000;
printf("%lld\n",value);
uint8_t* ptr = (uint8_t*)&value;
printf("%lld\n",*((uint64_t*)(ptr)));//While accessing the value you need typecast it back to uint64_t type.
return 0;
}
希望这有帮助。
答案 2 :(得分:0)
考虑以下计划:
#include <stdio.h>
#include <stdint.h>
struct some_struct{
uint64_t value;
};
int main(void){
uint64_t memory[10] = {111111111,22222222,0x1111111111111111,444444444,5,6,7,8,9,20};
struct some_struct *control = malloc(sizeof(struct some_struct));
int pc = 0;
control->value = memory[pc+2];
fprintf(stderr, "ptr = %llu, %llu\n", control->value, memory[2]);
}
这里我试图访问作为数组的“内存”的第3个元素
64位整数。
希望这会有所帮助。