[英]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個字節,其值我們不知道它們是什么。 因此,它會像您觀察到的那樣讀取“垃圾”。
static_cast
不提供運行時檢查,如果您知道引用特定類型的對象,則使用該檢查。
第二個案例實際上是c-style cast
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.