2012-05-09 67 views
0

考慮下面的代碼片斷:C++雙PTR到長的ptr轉換

double * p = new double[16]; 

int value = 1; 
void * q = p; 
*((double *)q) = value; 

int x = ((long *)p)[0]; 

cout << "Value of x for double * to long * = " << x << endl; 

*((int *)q) = value ; 

x = ((long *)p)[0]; 

cout << "Value of x for int * to long * = " << x << endl; 

這裏的輸出分別爲0和1。任何人都可以向我解釋爲什麼?

此外,如果我直接訪問指針值...即。 p [0],這兩種情況下的值都正確顯示爲1。爲什麼?

+1

所有這些類型轉換都被視爲代碼異味。不要在真實的代碼中使用。 – iammilind

+2

這基本上是'reinterpret_cast'。該標準不能保證你甚至可以得到什麼結果(即從有效的結果)。 –

回答

1

整數以直接二進制形式存儲在內存中,因此您可以在intlong之間進行轉換,而不會造成任何問題。 doulbe使用浮點二進制語法進行存儲,其中一些位用於描述尾數,其他位用於描述指數(類似於科學記數法,即5e2 = 500)。

如果您嘗試使用double的數據作爲double的數據,那麼由於二進制存儲值的不同方式,它將無法正確轉換。

相關問題