2012-12-06 395 views
3

行,所以我試着這樣做static_cast <int>(var)和*(int *)&var之間的區別是什麼?

int b; 
char x = 'a'; 

//Case 1  
b = static_cast<int>(x); 
std::cout<<"B is : "<<b<<std::endl; 

//Case 2 
b = *(int*)&x; 
std::cout<<"B is changed as :: "<< b <<std::endl; 

現在我知道的情況下,2,x第一個字節被重新解釋認爲它是一個整數,位模式被複制到b這給一些垃圾和在情況1中,它僅將值從char轉換爲int

除此之外,這兩者之間是否有區別?

+11

一個是未定義的行爲,另一個不是。 – Mysticial

回答

12

第一個只是將值轉換爲:int b = x;int b = static_cast<int>(x);相同。

第二種情況假設生活在x居住的地方的int,然後嘗試讀取int。這完全是未定義的行爲。 (例如,int可能比char佔用更多的空間,或者它可能是在char生活在一個地址在沒有int都不能活了。)

0
  1. static_cast不提供運行時檢查,這如果您知道您引用了特定類型的對象,則會使用它。

  2. 的Seconde系列案件實際上是c-style cast

2

的第二種情況是C樣式轉換(由bhuang3標識),但它不是C風格等效於case 1。這將是 b = (int)x;。情況2的C++等價物將是b = *reinterpret_cast<int*>(&x);無論採取哪種方式,情況2都是未定義的行爲,因爲x佔用一個字節,而在x的地址處強制讀取一個int值的數據將導致分段錯誤(總線錯誤開啓一些系統),如果它不在int的合法地址中,或者它只是讀取接下來的3個字節,其值我們不知道它們是什麼。因此,它讀取「垃圾」,如你所觀察到的。

+0

@phonetagger .....情況-2可以方便地找到一臺機器的字節順序.... – Recker

+0

@noleptr - 是的,有點。但是相反:在int位置讀取一個字節。如上所述,如果在int邊界上未對齊,則在字節位置讀取int可能爲SEGV。 – phonetagger

+0

@noleptr:是的;但只有使用至少與整數一樣長的char數組(否則代碼被破壞)。但是這些信息並沒有那麼有用,任何需要你知道這個(字節順序)的問題都已經以更好的方式解決了。 –

相關問題