如題:
int a = 10;
int *p1 = &a;
float *p2;
p2 = (float*)p1;
cout<<*p2<<endl;
上述代碼輸出為什么不是10?
謝謝。
uj5u.com熱心網友回復:
浮點和整形的記憶體存盤形式不一樣浮點存盤參考以下
https://www.jianshu.com/p/8ee02e9bb57d
uj5u.com熱心網友回復:
浮點格式存盤在32位記憶體中uj5u.com熱心網友回復:
首先,這是一個未定義行為,試圖將int*和float*型別指標指向同一片記憶體區域違反了strict aliasing rule。因此,輸出的結果是不確定的,在不同資料模型的機器上其結果不同。此外,int和float的存盤形式不同導致了int*和float*對同一片記憶體的解釋不同,可以參考IEEE754標準,但并不是所有機器都按該標準儲存float。
uj5u.com熱心網友回復:
直接按位轉肯定是不行的,因為浮點數跟整型在機器中的表示方法不同,這在集成第三方庫的時候最容易出問題,而且不容易檢錯,所以指標型別是非常不建議強轉的,要轉也是在void*和其他型別中轉,不同型別的指標之間強轉幾乎100%是錯誤的行為。uj5u.com熱心網友回復:
一千個讀者就有一千個哈姆雷特。這句話解釋這個問題是非常合適的
uj5u.com熱心網友回復:
float *p2; 沒有初始化NULL。uj5u.com熱心網友回復:
指標轉換不是型別轉換。整數和浮點之間的互轉回涉及到記憶體的變化。指標轉換不會改記憶體,而整數和浮點數的表示方式是不同的,轉換過去數值當然不一樣
uj5u.com熱心網友回復:
不能這樣轉。在c++中使用static_cast<int*>會直接報錯。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/11071.html
標籤:C++ 語言
上一篇:c++參考的使用
