[英]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.