這樣做的最佳方式是什麼?將32位指針轉換爲64位整數
說我有:
void* p = 0xc8f68000;
unsigned long long v = (unsigned long long)p;
我得到的V = 0xffffffffc8f68000代替0x00000000c8f68000。我必須使用班次嗎?
這樣做的最佳方式是什麼?將32位指針轉換爲64位整數
說我有:
void* p = 0xc8f68000;
unsigned long long v = (unsigned long long)p;
我得到的V = 0xffffffffc8f68000代替0x00000000c8f68000。我必須使用班次嗎?
似乎正在發生的事情是0xc8f68000被當作簽名的 32位整數,然後被轉換爲無符號。
void* p = 0xc8f68000;
unsigned long long v = (unsigned long)p;
或可能更好:你應該得到「正確」的價值
void* p = 0xc8f68000;
unsigned long long v = (size_t)p;
,因爲後者不依賴頁上竟然是32位。
但是,我質疑你爲什麼要這樣做。
無論何時處理指向整數轉換的指針,最好使用uintptr_t
。這是在投射指針時避免大小和簽名擴展問題的便攜方式。
#include <stdint.h>
void *p = 0xc8f68000;
uint64_t v = (uintptr_t)p;
等等,是否有一個類似屬性的整數類型?如果其他所有內容全部爲NULL,則只需要8位? 或者其他方式也可以正常工作 – MarcusJ
你怎麼打印呢? – this
如果原生整數大小爲32位,則值0xc8f68000爲負數...使用0xc8f68000u' – vonbrand
嘗試'void * p = 0xc8f68000ull;' – Dmitri