我有一个 32 位地址
uint32_t ptrToValue;
我想从这个内存位置获得一个 64 位的值。
如果我喜欢这样
uint64_t value = *(uint64_t*) ptrToValue;
我收到警告“使指针具有不同的整数大小”
我该如何处理?
我有一个 32 位地址
uint32_t ptrToValue;
我想从这个内存位置获得一个 64 位的值。
如果我喜欢这样
uint64_t value = *(uint64_t*) ptrToValue;
我收到警告“使指针具有不同的整数大小”
我该如何处理?
使用正确大小的整数类型:intptr_t
. 这是一个整数类型,保证可以转换为指针并返回。
我有一个 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 位值。