最好的方法是什么?
说我有:
void* p = 0xc8f68000;
unsigned long long v = (unsigned long long)p;
我得到v = 0xffffffffc8f68000而不是0x00000000c8f68000。我必须使用shift吗?
答案 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位。
我问你为什么要这样做。