C++のreinterpret_cast
のC相当語句は何ですか?reinterpret_castに相当するCは何ですか?
答えて
int *foo;
float *bar;
// c++ style:
foo = reinterpret_cast< int * >(bar);
// c style:
foo = (int *)(bar);
元の質問へのコメントでlitbの非常に良い点にも注意してください。 – Crashworks
C-styleがちょうど括弧内の型の名前のように見えるキャスト:
void *p = NULL;
int i = (int)p; // now i is most likely 0
は明らかにこれよりキャストのためのより良い使い方がありますが、それは基本的な構文です。
なぜ ' ?ここで例外は何ですか? – bzeaman
あなたは他のタイプと同じようにあなたが自由に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;
自由に型をキャストすることができます。望む通りにできない可能性があり、何もすることが保証されない可能性があります。 –
それが存在しない、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
あなたが値のアドレスを取ることができた場合は、一つの方法は、異なるタイプへのポインタに、それへのポインタをキャストすることであり、ポインタを間接参照してください。例えば
、浮動小数点から整数変換:
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を使うことはできませんが、サポートされている型(例えば、異なるポインタ型の間)で似ています。
上記の出力が意味をなさないことを確認しましょう。
バイナリの最後の答え: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です。
何cに対するREINTERPRET
オペレータについて:キャストが(c)において、変換を意味するので、私は、「reinterpret_castは」と言うのは好きじゃない
#define REINTERPRET(new_type, var) (* ((new_type *) & var))
、 再解釈が反対を意味している間:変換なしに。
なぜ誰かがこれを行うべきですか?それは誤解を招く。あなたのコードをプロンプト化されていない複合体にしないでください。 –
- 1. C++ CLIに相当するC#動的キーワードは何ですか?
- 2. C++のdynamic_castに相当するC#とは何ですか?
- 3. Objective C "@class MyClassName"に相当するC++は何ですか?
- 4. C#でLinkedHashSet(Java)に相当するものは何ですか?
- 5. .netのcurrentProcess.MainModuleに相当するC++は何ですか?
- 6. alertDidEnd:Objective-Cのvoid *に相当するMonoは何ですか?
- 7. C#Regex.Replaceメソッドに相当するXMLは何ですか?
- 8. preg_match_allに相当するC#とは何ですか?
- 9. VBのWithステートメントに相当するC#とは何ですか?
- 10. このC#エンコードコードに相当するPHPは何ですか?
- 11. C#Server.URLEncodeのJavaScriptに相当するものは何ですか?
- 12. Java DecimalFormatに相当するC#とは何ですか?
- 13. iOSのC#ドロップダウンコンボボックスに相当するものは何ですか?
- 14. C#のPropertyGridに相当するDelphiとは何ですか?
- 15. Visual C++のMy.Resourcesに相当するものは何ですか?
- 16. vsprintfに相当するC++(ストリーム)は何ですか?
- 17. C#のNSDictionaryに相当するものは何ですか?
- 18. PHPの "self ::"に相当するC#とは何ですか?
- 19. Pythonのre.split()に相当するObjective-Cとは何ですか?
- 20. JavaのThrowableに相当するC#とは何ですか?
- 21. WinRT(C#)のSystem.Diagnostic.Processに相当するものは何ですか?
- 22. C scanf()関数に相当するcmdスクリプトは何ですか?
- 23. C#とは何ですか?Delphi TDecompressionStreamに相当しますか?
- 24. Objective-CのcomponentsSeparatedByStringに相当するC#.NET Silverlightとは何ですか?
- 25. Objective C "@property(nonatomic、retain)"のC++に相当するものは何ですか?
- 26. uint32とuint64でOSX、C相当のものは何ですか?
- 27. BufferedImage.getRGB C#相当ですか?
- 28. (パスカルから)C/C++に相当する
- 29. C#でのJavaのデフォルト(パッケージ)アクセスに相当するものは何ですか?
- 30. C#でJavaのSimpleDateFormatクラスに相当するものは何ですか?
Cの '(type)exression'は、C++の' reinterpret_cast'よりもはるかに多くのことを行うことができます(結局のところ、2つの異なる言語です - とにかくそれほど期待できません)。整数型と浮動小数点型を互いにキャストできます。 C++の '(type)expression'は' reinterpret_cast'と同等であると答えてはいけません。 –
@litbこれは興味深いコメントです。私はVC2008によって生成されたアセンブリコードをチェックし、同じコードを省略します。私はこれでは十分ではないと確信していますが、いつそれが違うのですかもっと知りたいと思っています。 – AraK
コンパイル時のエラーと未定義の動作の違い: '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'は必要な調整 –