获取具有32位地址的64位值

时间:2013-03-07 08:09:01

标签: c

我有一个32位地址

uint32_t ptrToValue;

我希望从这个内存位置获得64位值。

如果我喜欢这个

uint64_t value = *(uint64_t*) ptrToValue;

我收到警告“制作一个不同整数的指针”

我该如何处理?

2 个答案:

答案 0 :(得分:3)

使用正确大小的整数类型:intptr_t。这是一个完整的类型,保证可以转换为指针并返回。

答案 1 :(得分:1)

  

我有一个32位地址

可能你的意思是你有一个指向32位(4字节)内存的指针。

  

uint32_t ptrToValue;

你是说这个?:

  

uint32_t * ptrToValue;

当您添加*时,警告应该消失。

正如jogojapan在评论中提到的那样忽略了对齐问题,所以让我解释一下。

如果组合的64位值在64位边界(一个字节地址可被8整除),那么如果你想要转换指针并一次读/写64位就没有问题。但是,如果不是,您的计算机不支持未对齐访问,则会发生错误(即程序崩溃)。

如果您希望代码在任何计算机上运行(至少那些可以一次存储64位),您将不得不使用联合:

typedef union {
    uint32_t b32[2];
    uint64_t b64[1];
} bits64;

然后,您可以声明bytes8类型的变量并使用b32[0]b32[1]b64[0],具体取决于您是要将其解释为32位还是64位值。 / p>