2013-02-01 8 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; 
} 

ich den Ausgang zu erwarten sind wie folgt:Wie gibt man ein Zeichen als Ganzzahl über cout aus?

ab 
cd 
ef 

Doch, ich habe nichts.

Ich denke, das liegt daran, dass Cout immer 'char', 'signed char' und 'unsigned char' als Zeichen und nicht als 8-Bit-Ganzzahlen behandelt. "Char", "signed char" und "unsigned char" sind jedoch alle ganzzahlige Typen.

Also meine Frage ist: Wie ein Zeichen als Integer durch Cout ausgeben?

PS: static_cast (...) ist hässlich und benötigt mehr Arbeit, um zusätzliche Bits zu trimmen.

+0

afaik, Casting ist der effektivste Weg, ... (zum Beispiel 'static_cast ()') – Nim

+0

es 'int' Gießen? –

+1

btw. Der einzige Grund, warum Sie auf "Trimmen" zurückgreifen müssen, ist, dass Sie die Typen offensichtlich nicht korrekt verwenden (die ersten beiden * überschneiden sich eindeutig) und das ist, was Sie als Ergebnis erhalten. Wenn du immer den richtigen Typ benutzt hast, dann ist der Cast einfach: 'static_cast (...)' ... – Nim

Antwort

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

Das funktioniert, solange der Typ + Operator mit gewöhnlicher Semantik einen unäre bietet. Wenn Sie eine Klasse definieren, die eine Zahl darstellt, um einen unären + -Operator mit kanonischer Semantik zu versehen, erstellen Sie eine operator+(), die einfach *this zurückgibt, entweder nach Wert oder durch reference-to-const.

Quelle: 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

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

+1

Dies ist eher verschleiert. Ein einfacher 'static_cast' wie in [sheis Antwort] (https://stackoverflow.com/a/14644745/1557062) vermittelt deutlich die Absicht. – sigy

7

sie zu einem Integer-Typ Gegossenes (und Bitmaske entsprechend!) D.h .:

#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

Und die Ausgabe von 'c1' und' c2' ist 'ffffffab' und' ffffffcd', was _nicht_ ist, was das OP erwartet. –

+0

@ Mr.C64 Guter Punkt. Bearbeitet, danke. – sheu

+0

"char", "signed char" und "unsigned char" sind jedoch alle ganzzahlige Typen. static_cast (...) ist hässlich und benötigt mehr Arbeit, um zusätzliche Bits zu trimmen. – xmllmx

3

Vielleicht:

Hoffe, es hilft.

Verwandte Themen