簡體   English   中英

我可以通過reinterpret_cast將int的空指針轉換為long類型

[英]Can I convert a null pointer of int to a long type by reinterpret_cast

int *pt = 0;
long i = reinterpret_cast<long>(pt);

我保證是0嗎? 這是明確定義還是實現定義? 我檢查了c ++標准,但它只說明了這一點

指向數據對象或函數(但不是指向成員的指針)的指針可以轉換為足以包含它的任何整數類型。

在這種情況下,pt不指向任何數據對象。 該規則適用於此案嗎?

i不一定有任何價值。 結果是實現定義的。

在C ++中,指針的表示是實現定義的,包括空指針的表示。 為指針指定整數值零時,將該指針設置為實現定義的空指針值,該值不一定是全位零。 將該值轉換為整數的結果是通過傳遞性實現定義的。

但更麻煩的是, reinterpret_cast完成的映射無論如何都是實現定義的。 因此,即使空指針值是全位 - 零,一個實現也可以自由地產生它想要的結果。 您只能保證在退回時獲得原始值。

大家都說,你的報價后面的下一句話包括說明:

[注意:對於那些了解底層機器的尋址結構的人來說,這並不奇怪。 - 尾注]

因此,即使不需要特定的映射,實際上你可以采取有根據的猜測。


假設long足夠大。 在C ++ 0x中使用uintptr_t ,可選擇在<cstddef>定義。

我不明白為什么不會。 問題是所討論的整數類型不能保持高值,但如果它是空指針則沒有問題。

是的,它在運行時指向的位置並不重要; 唯一重要的是指針的類型。 “對數據對象或函數”只意味着“常規”對象指針和函數指針(即指向目標代碼的指針)都可以重新轉換為數字類型。

我認為上面的代碼安全地在所有 已知的 通用平台上存儲0到'i'。

你想要reinterpret_cast(pt),但是,那會有效。 reinterpret_cast與舊的C樣式演員(長)相同,並假設您知道自己在做什么。

暫無
暫無

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

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