2009-09-05 17 views
25

C++のreinterpret_castのC相当語句は何ですか?reinterpret_castに相当するCは何ですか?

+20

Cの '(type)exression'は、C++の' reinterpret_cast'よりもはるかに多くのことを行うことができます(結局のところ、2つの異なる言語です - とにかくそれほど期待できません)。整数型と浮動小数点型を互いにキャストできます。 C++の '(type)expression'は' reinterpret_cast'と同等であると答えてはいけません。 –

+0

@litbこれは興味深いコメントです。私はVC2008によって生成されたアセンブリコードをチェックし、同じコードを省略します。私はこれでは十分ではないと確信していますが、いつそれが違うのですかもっと知りたいと思っています。 – AraK

+0

コンパイル時のエラーと未定義の動作の違い: 'int a = reinterpret_cast ( 'a');'(コンパイルエラー)。 'struct A {int a; };構造体B {int b; };構造体C:A、B {int c; }; int main(){C c; B&b = reinterpret_cast (c); b.b = 1; } '(未定義の振る舞い:'(B&)c'に変更したときの違いに気づく:Bサブオブジェクトがオフセット '!= 0x0'に格納されている場合、' reinterpret_cast'は必要な調整 –

答えて

22
int *foo; 
float *bar; 

// c++ style: 
foo = reinterpret_cast< int * >(bar); 

// c style: 
foo = (int *)(bar); 
+4

元の質問へのコメントでlitbの非常に良い点にも注意してください。 – Crashworks

4

C-styleがちょうど括弧内の型の名前のように見えるキャスト:

void *p = NULL; 
int i = (int)p; // now i is most likely 0 

は明らかにこれよりキャストのためのより良い使い方がありますが、それは基本的な構文です。

+1

なぜ ' ?ここで例外は何ですか? – bzeaman

1

A Cスタイルのキャストは次のとおりです。

int* two = ...; 
pointerToOne* one = (pointerToOne*)two; 
+0

'=='は単一ではありません'=' '? – KPexEA

+0

どちらも有効なステートメントであり、両方ともキャストのためにのみコンパイルされます。もちろん、コンパイル以外のことが起こるようなら、 '='を使用します。 – MSalters

0

あなたは他のタイプと同じようにあなたが自由にC言語でポインタ型にキャストすることができます。

は完全なものにするには:

void *foo; 
some_custom_t *bar; 
other_custom_t *baz; 
/* Initialization... */ 
foo = (void *)bar; 
bar = (some_custom_t *)baz; 
baz = (other_custom_t *)foo; 
+4

自由に型をキャストすることができます。望む通りにできない可能性があり、何もすることが保証されない可能性があります。 –

2

それが存在しない、reinterpret_castは変更できないため、[const性] [3]。例えば、

int main() 
{ 
    const unsigned int d = 5; 
    int *g=reinterpret_cast< int* >(&d); 
    (void)g; 
} 

はエラーを生成します。

dk.cpp: In function 'int main()':
dk.cpp:5:41: error: reinterpret_cast from type 'const unsigned int*' to type 'int*' casts away qualifiers

1

あなたが値のアドレスを取ることができた場合は、一つの方法は、異なるタイプへのポインタに、それへのポインタをキャストすることであり、ポインタを間接参照してください。例えば

、浮動小数点から整数変換:

int main() 
{ 
    float f = 1.0f; 

    printf ("f is %f\n", f); 
    printf ("(int) f is %d\n", (int)f); 
    printf ("f as an unsigned int:%x\n", *(unsigned int *)&f); 
} 

出力:これはおそらく、C標準で動作することが保証されていないことを

f is 1.000000 
(int) f is 1 
f as an unsigned int:3f800000 

注意。とにかく、floatからintにキャストするためにreinterpret_castを使うことはできませんが、サポートされている型(例えば、異なるポインタ型の間)で似ています。

上記の出力が意味をなさないことを確認しましょう。

http://en.wikipedia.org/wiki/Single_precision_floating-point_format#IEEE_754_single-precision_binary_floating-point_format:_binary32

バイナリの最後の答え:0の符号ビット、8続く:

0011 1111 1000年0000 0000 0000 0000 0000

これは、IEEE-754浮動小数点形式であります(011 1111 1)、23ビットの仮数(すべてゼロ)が続きます。

指数を解釈するために、減算127:01111111b = 127、および127から127 = 0の指数は0

は、仮数を解釈小数点に続く1の後にそれを書くことである:1.00000000000000000000000(23ゼロ)。これは10進数で1です。

したがって、予想通り3進数3f800000で表される値は1 * 2^0 = 1です。

0

何cに対するREINTERPRETオペレータについて:キャストが(c)において、変換を意味するので、私は、「reinterpret_castは」と言うのは好きじゃない

#define REINTERPRET(new_type, var) (* ((new_type *) & var)) 

、 再解釈が反対を意味している間:変換なしに。

+2

なぜ誰かがこれを行うべきですか?それは誤解を招く。あなたのコードをプロンプト化されていない複合体にしないでください。 –

関連する問題