13

だから私は2文字の配列を持っています

unsigned char v[2];

v[0]の値を0から255までの数値で表示したいのですが、

cout << v[0] << endl; //prints some garbage

cout << (void*)v[0] << endl; //prints the right thing but in hex

だから私は試しました

cout << (int)v[0] << endl;

また

printf("%d\n", v[0]);

これはまさに私が望んでいたことを示していますが、まったく好きではありません。また、私がまったく理解していないのは、これが機能しない理由です:

cout << reinterpret_cast<int>(v[0]) << endl; //compiler error
4

6 に答える 6

22

(素人の言葉で言えば)reinterpret_cast実装定義の方法でオブジェクトのビットを別の型として解釈するために使用されます。それは望ましくありません: 変換 (char から int へ) が必要です。static_cast代わりに使用してください。

(可能なすべての使用法は5.2.10reinterpret_castにリストされています。これはそれらの 1 つではありません。)

于 2012-08-18T18:53:35.747 に答える
15
cout << v[0] << endl; // prints some garbage

ガベージではなく、v[0] の値が表す文字。

cout << (void*)v[0] << endl;

これは、値をポインターに「変換」しv[0](最初はポインターではないため、未定義の動作です)、そのポインターの値を 16 進値として出力します。

cout << (int)v[0] << endl;

これにより、値が int に変換v[0]され (明確に定義されています。単に int に昇格されます)、値が表示されます。

reinterpret_cast、他の人が述べたように、それができることにはいくつかの制約があります。正しい答えは、次を使用することstatic_cast<int>です。

cout << static_cast<int>(v[0]) << endl;
于 2012-08-18T18:59:16.920 に答える
6
  • reinterpret_cast: "...任意の整数型を任意のポインター型に変換でき、その逆も可能です。" これは、ポインターである可能性のあるものを正しいポインター型に変換する場合にのみ使用してください (unsigned char は、明らかに 8 ビット システム以外ではポインターにすることはできません)。

  • static_cast: 型を別の型にキャストする場合に使用します (float から int、または unsigned char から int など)。

coutunsigned char を ASCII 文字コードとして出力しようとするため、int に変換するstatic_cast<int>(v[0])のが正しい方法です。

于 2012-08-18T19:00:15.190 に答える
3

reinterpret_castポインター型の値を他のポインター型の値または整数値に、またはその逆に変換して、宛先ポインター値の逆参照を可能にします。ただし、ある整数型の値を別の整数型の値に変換しようとしています。それはうまくいきません。reinterpret_cast参照型のキャストをサポートします。これは、フォローアップ逆参照を使用したそれぞれのポインター値のキャストと同等です。だからあなたがやりたかったようです

// NOTE: THIS IS UNDEFINED BEHAVIOR
cout << reinterpret_cast<int&>(v[0]) << endl; 

これは整形式ですが、unsigned char を整数オブジェクトとして再解釈するため、動作が保証されません (可能性のある問題は、ストレージの無効な配置から互換性のないサイズ (1 バイトと 4 バイト) までさまざまです)。これらのケースは、(int)v[0]キャストを実行することで解決できます。それで問題ないと思います。+v[0]また、値を自動的に (符号付きまたは符号なし) に昇格させると言うことができintます。

于 2012-08-19T00:41:35.637 に答える
3

reinterpret_cast を使用している方法では、char を int として読み取ろうとしていますが、それらは同じサイズではありません。

于 2012-08-18T18:55:16.140 に答える