我有一个32位的地址获得一个64位值与32位地址
uint32_t ptrToValue;
,我想有从这个存储空间,64位值。
如果我不喜欢这个
uint64_t value = *(uint64_t*) ptrToValue;
我得到一个警告“使得不同的整数大小的指针”
我如何处理这个问题?
我有一个32位的地址获得一个64位值与32位地址
uint32_t ptrToValue;
,我想有从这个存储空间,64位值。
如果我不喜欢这个
uint64_t value = *(uint64_t*) ptrToValue;
我得到一个警告“使得不同的整数大小的指针”
我如何处理这个问题?
我有一个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位值。
但是否将'uint32_t *'强制转换为'uint64_t *'还是可以的,仍然取决于对齐方式,并且一旦取消引用该指针,就会依赖于该地址是否真的存在'uint64_t'。 – jogojapan 2013-03-07 08:50:33
@jogojapan谢谢你的评论,我扩大了我的答案! – 2013-03-07 09:09:43
你为什么要这样做? – Mysticial 2013-03-07 08:10:13
如果您正在编译64位代码,这是绝对无效的。 – nneonneo 2013-03-07 08:11:41
我在32位长地址的PPC上工作,我需要存储和读取64位值 – Peter 2013-03-07 08:11:43