2

私は次のコードを持っています

#include <iostream>
using namespace std;
int main(){

    int i;
     char *p="this is a string";
     i=reinterpret_cast<int>(p);
     cout<<i<<"\n":



     return 0;
}

出力は次のとおりです: 7648 reinterpret_cast について説明してください

4

4 に答える 4

4

reinterpret_castキャストしているデータは、変換が実行されずに別の型と見なされます。標準によると、 a の後の動作が定義されているのreinterpret_castreinterpret_cast、元の型に戻ることだけです。

これは少し役に立たないように思えますが、これを使用する理由の 1 つは、たとえば C++ で特定の C ライブラリ (pthreads など) を使用する場合です。コールバックを含む多くの C ライブラリは、タイプのパラメーターをコールバックに渡しvoid*ます。C++ では、これに対処する適切な方法は、パラメーターとして使用したいものへのポインターを取得し、reinterpret_castそれをvoid*C ライブラリーに渡すときにポインターを取得してからreinterpret_cast、実際にコールバック内にあるものに戻すことです。

標準によって定義された動作であることが保証されているわけではありませんが、ほとんどのプラットフォーム/コンパイラでreinterpret_castは、同じビット パターンを使用してデータが異なる型であると単純に見なされます。たとえば、dたまたまビット パターンが である 32 ビットの double があり01101010 00111100 01101010 01000001、 と書くと、int i = reinterpret_cast<int>(d)ビットパターンがiとなる整数になります01101010 00111100 01101010 01000001。 . そして明らかに、関連する型が同じサイズでない場合、これによりすぐに問題が発生する可能性があります。

于 2010-07-29T15:14:26.047 に答える
2

ここを参照してください。

具体的に何が不明ですか?具体的にお願いします。また、質問する前に検索してください。これについては SO で多くの質問があります。

于 2010-07-29T14:54:24.583 に答える
1

reinterpret_cast<>phere へのポインターをチェックせずに変換しますが、これが何を表すintかを推測することはできません。intあなたができる唯一のことは、このポインターを元の状態に戻すことです。

pより実際的な注意として、コンパイラは へのアドレスポイントをint値に入れる可能性がありますが、intサイズはシステム ポインタのサイズと一致しない可能性があるため、おそらくuintptr_tの代わりにそのようなものを使用する必要がありintます。

整数の文字列表現を実際の整数値に変換しようとするBoostlexical_cast<>のようなものを使用できますが、それがここでの目標であったかどうかはわかりません。

于 2010-07-29T14:55:08.623 に答える
1

説明することはあまりありません。の結果reinterpret_castはプラットフォーム固有です。テスト出力は、文字列定数のアドレスか、強制的にint.

于 2010-07-29T14:56:45.920 に答える