8

以前に尋ねられたかどうかはわかりませんが、私は信じていたに違いありません。質問の開始のための単純な行を考えてみましょう:

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同じテクニックで動作するはずですか?

4

2 に答える 2

7

intからへの明確に定義された変換がありcharます。それが何をするかstatic_castです。実際、キャストは必要ありません。ここで割り当てを使用できます。一方、reinterpret_castあるタイプのオブジェクトのビットが別のタイプのオブジェクトを表すふりをすることを言います。一部のタイプでは(多かれ少なかれ)大丈夫ですが、変換を適用せずにintのビットをcharのビットとして使用できるふりをする賢明な方法はありreinterpret_castません。

于 2013-02-17T17:51:22.013 に答える
3

static_castは、定義された変換を強制的に実行するか、定義された変換を元に戻すことができます(const / volatileの追加または削除以外)。reinterpret_castは、何でもできるスーパーキャストだと思います。そうではありません。一連の定義済み変換があります。

あるタイプのポインターを別のタイプのポインターに変換できます(const / volatileが保持されている限り)。参照についても同様に行うことができます。整数型へのポインタをキャストでき、その逆も可能です。

それ以外は何もしませんし、あなたのプログラムは整形式ではありません。

于 2013-02-17T17:59:26.737 に答える