3

わかりましたので、これをやってみました

 int b;
 char x = 'a';

//Case 1    
b = static_cast<int>(x); 
std::cout<<"B is : "<<b<<std::endl;

//Case 2
b = *(int*)&x;   
std::cout<<"B is changed as  :: "<< b <<std::endl;

xケース 2 では、 の最初のバイトが整数であると考えるように再解釈され、ビット パターンがコピーされbてガベージが生成され、ケース 1 では値が からcharに変換されることがわかりましたint

それとは別に、これら2つの間に違いはありますか?

4

3 に答える 3

12

最初のものは値を変換するだけです:はとint b = x;同じint b = static_cast<int>(x);です。

int2番目のケースは、実際に住んでいる場所に住んでいるふりをしてx、それを読み込もうとしますint。それは完全に未定義の動作です。(たとえば、intがよりも多くのスペースを占めるchar場合や、誰も住むことができcharない住所に住んでいる場合がありますint。)

于 2012-12-06T22:16:18.170 に答える
2

2 番目のケースは C スタイルのキャスト (bhuang3 で識別) ですが、ケース 1 と同等の C スタイルではありません b = (int)x;。また、ケース 2 に相当する C++ は、b = *reinterpret_cast<int*>(&x); いずれにしても、ケース 2 は未定義の動作です。これは、x が 1 バイトを占有するためです。一方、x のアドレスで int に相当するデータを強制的に読み取ると、セグメンテーション フォールト (一部のバス エラー) が発生します。システム) の正当なアドレスにない場合int、または次の 3 バイトを読み取るだけで、その値が何であるかはわかりません。したがって、あなたが観察したように「ゴミ」と読みます。

于 2012-12-06T22:25:11.873 に答える
0
  1. は、特定のタイプのstatic_castオブジェクトを参照していることがわかっている場合に使用される実行時チェックを提供しません。

  2. 2番目のケースは実際にはc-style cast

于 2012-12-06T22:21:38.070 に答える