簡體   English   中英

將void *分配給UINT或unsigned int

[英]Assigning void* to UINT or unsigned int

我今天在工作地點學到了這一點。 我讀這個這個這個發布我的問題了。

這是我的高級同事告訴我的:

您不能將void *分配給UINT或unsigned int。 它不適用於64位。

但為什么? 是因為void*unsigned int在不同的體系結構上(如其他問題所述)具有不同的大小,還是其他原因?

您基本上是正確的: 不能保證unsigned int的機器字長與void* ,因此您不能在它們之間進行轉換而不會丟失信息。 是一個很好的常見問題解答。

要記住的主要事情是void*是任意數據指針 ,而不是真正的任意指針。 實際上,沒有真正通用的指針:例如,某些機器可能具有用於程序和數據的不同地址空間,因此指向每個指針的大小可能會有所不同。 有關更多信息,請參見此答案

是的,就是這種情況。

您的實現可以提供可選的類型uintptr_t ,但其定義如下:

以下類型指定了一個無符號整數類型,其屬性是可以將任何有效的指向void的有效指針轉換為該類型,然后再轉換回指向void的指針,結果將與原始指針進行比較:

uintptr_t

簽名的對方intptr_t也可能可用。 這些類型在<cstdint>標頭中可用。

通過選擇使用這些類型,您已經確認您的代碼將僅與在目標計算機上提供此類型的實現的子集一起編譯。

如果void*不能完全適應游戲結束的單unisigned int ,則大小顯然是一個阻止unisigned int 但是,即使sizeof(void*) == sizeof(unsigned int)您也遇到類型兼容性問題:一個保存數據指針,另一個保存數據指針。 您必須將reinterpret_cast<>()一個reinterpret_cast<>()轉換為另一個,並且所有關於此如何工作的賭注都沒有了。

取決於您的應用程序的目標。 您標記了VC++並提到了UINT類型-這樣看來您正在為Windows構建。 在32位Windows中,指針大小為32位,而在64位Windows中,指針大小為64位。 但是,兩種Windows版本的UINT類型的大小都類似於32位。 您可以使用__uint64UINT64 MS特定類型而不是UINT來確保它對於指針足夠大。 您還可以使用INT_PTR / UINT_PTR類型,這些類型專門用於匹配指針的大小(因此使它對於32/64位UINT_PTR透明)。

有關各種數據類型的參考,請參見http://msdn.microsoft.com/zh-cn/library/s3f49ktz.aspx

當然,所有這些都會使您的程序無法本地移植到其他體系結構/ OS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM