![](/img/trans.png)
[英]Why do I see a bigger value when I cast pointer to unsigned int as unsigned long long pointer?
[英]why does linux kernel (often) hold pointer in unsigned long object
我經常看到(例如在 Linux kernel 中) unsigned long
用於保存指針。 我想知道這是什么原因,因為指針的大小可能大於 integer 類型(包括 long)。
在 Linux 用戶空間應用程序中將指針保留在unsigned long
而不是uintptr_t
中是否可移植? (雖然我知道uintptr_t
保證從void *
轉換為uintptr
integer 並返回而不會丟失信息)
謝謝。
在 Linux 用戶空間應用程序中將指針保留在
unsigned long
而不是uintptr_t
中是否可移植? (雖然我知道uintptr_t
保證從void *
轉換為uintptr
integer 並返回而不會丟失信息)
“是”的意思是它可以在 Linux 的任何當前端口上工作,而且很可能在未來工作。 但為什么? 有一個非常好的 typedef 也指定了意圖: uintptr_t
- 它也使您的代碼可移植到 Win64。
uintptr_t
是 C99 的發明,Linux 比 C99 早了幾年。 那時沒有指定 integer 寬度足以容納指針的約定 - 但是那時,也沒有unsigned long long
,除了編譯器擴展,所以unsigned long
是你可以合理期望容納指針的全部,如果有的話確實如此。 到目前為止,對於任何運行 Linux 的新架構來說,都需要選擇long
類型,以便它足夠寬以用於指針size_t
等。
當 64 位 Windows 出現時,太多東西依賴於unsigned long
的某種表示,它仍然是 32 位,而不是保存指針所需的類型。 據我所知,目前所有相關平台僅在 Win64 unsigned long
上不夠寬,無法容納指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.