1

c ++では、型または型の参照へのcキャストの違いは何ですか?

foo = (unsigned int) whatever;  

// Is this the same as: 
foo = (unsigned int&) whatever;  
4

1 に答える 1

6

いいえ、まったく同じではありません。

(場合によっては、キャストの正確な性質が何であるかによって異なります。の型はとは無関係whateverであると仮定します。)whateverunsigned int

参照型への C キャストは、その型に対してunsigned int &a を実行することと同等ですreinterpret_cast

foo = reinterpret_cast<unsigned int &>(whatever);  

これは、定義上、

foo = *reinterpret_cast<unsigned int *>(&whatever);  

whateverこの場合、左辺値である必要があります。

言い換えれば、参照へのキャストは、タイプ punningのもう 1 つの方法です。オブジェクトとして占有されているメモリを単純に再解釈しています。一般に、動作は未定義です。たとえば、が のサイズよりも小さい場合、再解釈には に属さない「野生の」メモリも含まれます。whateverunsigned intsizeof whateverunsigned intwhatever

一方、非参照 C キャストは単なる値の変換であり、メモリの再解釈ではありません。への算術変換では、 unsigned intit は と同等ですstatic_cast(ただし、whateverがポインターの場合は と同等ですreinterpret_cast)。の値を読み取り、言語変換規則に従って型に変換whateverします (変換が存在する場合)。unsigned int

たとえば、これ

float f = 5;
unsigned int i = (unsigned int) f;

の値ftypeに変換します。これは、 value を受け取ることunsigned intを意味します。同時に、あなたのプラットフォームのサイズと同じサイズの場合、これはi5unsigned intfloat

unsigned int i = (unsigned int &) f;

は実際には、値を持つfloatobjectの内部オブジェクト表現を type のオブジェクトとして再解釈します。の結果の値は、一般に予測できません。通常、それは近くにさえありません(一般的な実装では、元の値の IEE754 表現を単純に受け取るだけです)。f5unsigned inti5floati

于 2013-01-17T17:49:29.337 に答える