3

我有一个 32 位地址

uint32_t ptrToValue;

我想从这个内存位置获得一个 64 位的值。

如果我喜欢这样

uint64_t value = *(uint64_t*) ptrToValue;

我收到警告“使指针具有不同的整数大小”

我该如何处理?

4

2 回答 2

3

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

于 2013-03-07T08:13:01.587 回答
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 位值。

于 2013-03-07T08:27:36.097 回答