2013-02-01 4 views
32
#include <iostream> 

using namespace std; 

int main() 
{ 
    char   c1 = 0xab; 
    signed char c2 = 0xcd; 
    unsigned char c3 = 0xef; 

    cout << hex; 
    cout << c1 << endl; 
    cout << c2 << endl; 
    cout << c3 << endl; 
} 

は、次のとおりです。文字をcoutから整数として出力する方法は?次のように私は出力を期待

ab 
cd 
ef 

しかし、私は何も得ませんでした。

私はCOUTは常に文字ではなく、8ビット整数として「文字」、「signed char型」と「unsigned char型」を扱うためであると思います。ただし、 'char'、 'signed char'、および 'unsigned char'はすべて整数型です。

だから私の質問は次のとおりです。COUTて整数として出力する方法文字?

PS:static_castを(...)は醜いですし、余分なビットをトリミングするより多くの作業が必要。

+0

は、私の知る限りで、キャストが最も効果的な方法です...(例えば '')(ををstatic_cast) – Nim

+0

int' 'にキャスト? –

+1

btw。あなたが "トリミング"に頼る必要がある唯一の理由は、タイプを正しく使用していないことです(最初の2つ*はっきりとオーバーフローします)。これが結果として得られます。あなたは常に正しい型を使用した場合、キャストは、単純である、 'static_castを(...)' ... – Nim

答えて

65
char a = 0xab; 
cout << +a; // promotes a to a type printable as a number, regardless of type. 

これは、タイプが通常のセマンティクスを持つ単一の+演算子を提供する限り機能します。単項+演算子に標準的なセマンティクスを提供するために、数値を表すクラスを定義する場合は、*thisを単なる値またはreference-to-constによって返すoperator+()を作成します。

ソース:Parashift.com - How can I print a char as a number? How can I print a char* so the output shows the pointer's numeric value?

+1

作業リンク:http://www.cs.technion.ac.il/users/yechiel /c++-faq/print-char-or-ptr-as-number.html – GetFree

+1

これはやや難解です。 [sheuの答え](https://stackoverflow.com/a/14644745/1557062)のような単純な 'static_cast'は、意図を明確に伝えます。 – sigy

7

、整数型へキャスト(および適切ビットマスク!)すなわち:

#include <iostream> 

using namespace std; 

int main() 
{ 
    char   c1 = 0xab; 
    signed char c2 = 0xcd; 
    unsigned char c3 = 0xef; 

    cout << hex; 
    cout << (static_cast<int>(c1) & 0xFF) << endl; 
    cout << (static_cast<int>(c2) & 0xFF) << endl; 
    cout << (static_cast<unsigned int>(c3) & 0xFF) << endl; 
} 
+2

'c1'と' c2'の出力は 'ffffffab'と' ffffffcd'です。これはOPが期待していたものではありません。 –

+0

@ Mr.C64良い点。編集、ありがとう。 – sheu

+0

ただし、 'char'、 'signed char'、および 'unsigned char'はすべて整数型です。 static_cast(...)は醜いので余分なビットをトリミングするためにはもっと多くの作業が必要です。 – xmllmx

3

は多分この:

はそれがお役に立てば幸いです。

関連する問題