static_cast 與 reinterpret_cast
reinterpret_cast是為了映射到一個完全不同類型的意思,這個關鍵詞在我們需要把類型映射回原有類型時用到它。我們映射到的類型僅僅是為了故弄玄虛和其他目的,這是所有映射中最危險的。(這句話是C++編程思想中的原話)
static_cast 和 reinterpret_cast 操作符修改了操作數類型。它們不是互逆的; static_cast 在編譯時使用類型信息執行轉換,在轉換執行必要的檢測(諸如指針越界計算, 類型檢查). 其操作數相對是安全的。另一方面;reinterpret_cast 僅僅是重新解釋了給出的對象的比特模型而沒有進行二進制轉換, 例子如下:
int n=9; double d=static_cast < double > (n);
上面的例子中, 我們將一個變量從 int 轉換到 double。 這些類型的二進制表達式是不同的。 要將整數 9 轉換到 雙精度整數 9,static_cast 需要正確地為雙精度整數 d 補足比特位。其結果為 9.0。而reinterpret_cast 的行為卻不同:
int n=9;
double d = reinterpret_cast<double * > (n);
這次, 結果有所不同. 在進行計算以后, d 包含無用值. 這是因為 reinterpret_cast 僅僅是復制 n 的比特位到 d, 沒有進行必要的分析.
因此, 你需要謹慎使用 reinterpret_cast.
Allows any pointer to be converted into any other pointer type. Also allows any integral type to be converted into any pointer type and vice versa.
One practical use of reinterpret_cast is in a hash function, which maps a value to an index in such a way that two distinct values rarely end up with the same index.
http://msdn.microsoft.com/en-us/library/e0w9f63b.aspx
// 02_reinterpret_cast.cpp : 定義控制臺應用程序的入口點。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
// Returns a hash code based on an address
unsigned short Hash( void *p )
{
unsigned int val = reinterpret_cast<unsigned int>( p );
return ( unsigned short )( val ^ (val >> 16));
}
int _tmain(int argc, _TCHAR* argv[])
{
int* pInt = NULL;
// 把負數解釋為地址
pInt = reinterpret_cast<int*>(-0x0024FFE4);
cout << pInt << endl; // FFDB001C 地址
// 4292542492,其十六進制表示正是FFDB001C
cout << reinterpret_cast<unsigned int>(pInt) << endl;
cout << UINT_MAX << endl; // 4294967295
int iValue = 9;
int* pValue = &iValue;
cout << &iValue << endl; // 0012FF1C 地址
cout << pValue << endl; // 0012FF1C 地址
cout << *pValue << endl; // 9 值
cout << reinterpret_cast<double*>(iValue) << endl; // 00000009 把iValue當作指針了
cout << reinterpret_cast<double*>(pValue) << endl; // 0012FF1C 地址
int a[20];
for ( int i = 0; i < 20; i++ )
cout << Hash( a + i ) << endl;
return 0;
}
/* 輸出:
FFDB001C
4292542492
4294967295
0012FF1C
0012FF1C
9
00000009
0012FF1C
65194
65198
65234
65238
65242
65246
65218
65222
65226
65230
65266
65270
65274
65278
65250
65254
65258
65262
65298
65302
*/
posted on 2011-02-16 20:00
七星重劍 閱讀(2502)
評論(0) 編輯 收藏 引用 所屬分類:
PL--c/c++