簡體   English   中英

static_cast之間有什么不同 <int> (var)和*(int *)&var?

[英]What is the diference between static_cast<int>(var) and *(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

除此之外,這兩者有什么不同嗎?

第一個只轉換值: int b = x; int b = static_cast<int>(x);

第二種情況假裝有一個int生活在x實際存在的地方,然后嘗試讀取int 這是徹頭徹尾的未定義行為。 (例如, int可能比占用更多的空間char ,或者它可能是在char生活在沒有地址int能永遠生活。)

第二種情況是C風格的演員(由bhuang3確定),但它不是C風格等同於案例1.那將是b = (int)x; 情況2的C ++等價物是b = *reinterpret_cast<int*>(&x); 無論你采用哪種方式,情況2都是未定義的行為,因為x占用一個字節,而強行在x的地址讀取一個int的數據,如果它不在合法地址,則會給你一個分段錯誤(某些系統上的總線錯誤)對於一個int ,或者它只會讀取接下來的3個字節,其值我們不知道它們是什么。 因此,它會像您觀察到的那樣讀取“垃圾”。

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

  2. 第二個案例實際上是c-style cast

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM