2013-03-07 41 views
3

我有一个32位的地址获得一个64位值与32位地址

uint32_t ptrToValue; 

,我想有从这个存储空间,64位值。

如果我不喜欢这个

uint64_t value = *(uint64_t*) ptrToValue; 

我得到一个警告“使得不同的整数大小的指针”

我如何处理这个问题?

+3

你为什么要这样做? – Mysticial 2013-03-07 08:10:13

+0

如果您正在编译64位代码,这是绝对无效的。 – nneonneo 2013-03-07 08:11:41

+0

我在32位长地址的PPC上工作,我需要存储和读取64位值 – Peter 2013-03-07 08:11:43

回答

3

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

+0

+1它也是标准定义的两个(另一个是'uintptr_t')之一,尽管不能保证它们是由您的实现(C99§7.20.1.4)提供的。如果需要指针的非指针存储,这是实现它的方法。 – WhozCraig 2013-03-07 08:19:33

+0

Downvote因为...? – nneonneo 2013-03-07 08:29:38

+0

不是我的;事实上恰恰相反。不知道为什么。 – WhozCraig 2013-03-07 08:31:56

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位值。

+0

但是否将'uint32_t *'强制转换为'uint64_t *'还是可以的,仍然取决于对齐方式,并且一旦取消引用该指针,就会依赖于该地址是否真的存在'uint64_t'。 – jogojapan 2013-03-07 08:50:33

+0

@jogojapan谢谢你的评论,我扩大了我的答案! – 2013-03-07 09:09:43