2014-03-07 137 views
0

這樣做的最佳方式是什麼?將32位指針轉換爲64位整數

說我有:

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

我得到的V = 0xffffffffc8f68000代替0x00000000c8f68000。我必須使用班次嗎?

+1

你怎麼打印呢? – this

+1

如果原生整數大小爲32位,則值0xc8f68000爲負數...使用0xc8f68000u' – vonbrand

+0

嘗試'void * p = 0xc8f68000ull;' – Dmitri

回答

0

似乎正在發生的事情是0xc8f68000被當作簽名的 32位整數,然後被轉換爲無符號。

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

或可能更好:你應該得到「正確」的價值

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

,因爲後者不依賴頁上竟然是32位。

但是,我質疑你爲什麼要這樣做。

5

無論何時處理指向整數轉換的指針,最好使用uintptr_t。這是在投射指針時避免大小和簽名擴展問題的便攜方式。

#include <stdint.h> 

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

等等,是否有一個類似屬性的整數類型?如果其他所有內容全部爲NULL,則只需要8位? 或者其他方式也可以正常工作 – MarcusJ