我有一个32位地址
uint32_t ptrToValue;
我希望从这个内存位置获得64位值。
如果我喜欢这个
uint64_t value = *(uint64_t*) ptrToValue;
我收到警告“制作一个不同整数的指针”
我该如何处理?
答案 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>