将32位指针转换为64位整数

时间:2014-03-07 01:33:28

标签: c

最好的方法是什么?

说我有:

 void* p = 0xc8f68000;
 unsigned long long v = (unsigned long long)p;

我得到v = 0xffffffffc8f68000而不是0x00000000c8f68000。我必须使用shift吗?

2 个答案:

答案 0 :(得分:6)

每当处理指向整数转换的指针时,最好使用uintptr_t。这是在转换指针时避免大小和符号扩展问题的可移植方法。

#include <stdint.h>

void *p = 0xc8f68000;
uint64_t v = (uintptr_t)p;

答案 1 :(得分:0)

似乎正在发生的事情是0xc8f68000被视为签名 32位整数,然后被转换为无符号。您应该通过以下方式获得“正确”值:

void* p = 0xc8f68000;
unsigned long long v = (unsigned long)p;

或者可能更好:

void* p = 0xc8f68000;
unsigned long long v = (size_t)p;

因为后者不依赖于p实际上是32位。

我问你为什么要这样做。