[英]reinterpret_cast<int*>(char*) vs. static_cast<int*>(static_cast<void*>(char*)) — which to use?
[英]How can static_cast can cast an int to char but not reinterpret_cast?
我不確定之前是否曾被問過,但一定是我相信的。 考慮問題開始的簡單路線:
int a ;
char b = reinterpret_cast<char> (a);
我理解reinterpret_cast
將類型x的位模式解釋為類型y,因為大小不匹配它不應該工作,實際上它不會。
現在考慮另一個代碼:
int a ;
char b = static_cast<char> (a);
這有效! 。 現在我的問題是它是如何工作的? 我的意思是編譯器會切掉這些位嗎? 。 我確定sizeof(char) < sizeof(int)
。 如果是這樣, reinterpret_cast
也應該采用相同的技術?
有一個明確定義的從int
到char
轉換; 這就是static_cast
作用。 事實上,你不需要演員; 你可以在這里使用作業。 另一方面, reinterpret_cast
表示假裝一種類型的對象中的位代表另一種類型的對象; 對於某些類型可以(或多或少),但沒有明智的方法假裝int中的位可以用作char中的位而不應用轉換, reinterpret_cast
不會這樣做。
static_cast可以強制定義轉換發生,也可以反轉定義的轉換(除了添加或刪除const / volatile)。 你認為reinterpret_cast是一些可以做任何事情的超級演員。 事實並非如此。 它有一組定義的轉換。
它可以將一種類型的指針轉換為另一種指針(只要保留const / volatile)。 它同樣可以用於參考。 它可以將指針轉換為整數類型,反之亦然。
除此之外,它沒有做任何事情,你的程序也沒有很好的形成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.