wake-up-neo.net

Wie kann man ein Zeichen als Ganzzahl durch Cout ausgeben?

#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 erwartete die Ausgabe wie folgt:

ab
cd
ef

Trotzdem habe ich nichts bekommen.

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

Meine Frage ist also: Wie gebe ich ein Zeichen als Ganzzahl durch Cout aus?

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

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

Dies funktioniert, solange der Typ einen unären +-Operator mit gewöhnlicher Semantik bereitstellt. Wenn Sie eine Klasse definieren, die eine Zahl darstellt, erstellen Sie eine operator+(), die einen unary + -Operator mit kanonischer Semantik bereitstellt, der einfach *this entweder nach Wert oder nach referenz-zu-const zurückgibt. 

source: Parashift.com - Wie kann ich ein Zeichen als Zahl drucken? Wie kann ich ein Zeichen * drucken, damit in der Ausgabe der numerische Wert des Zeigers angezeigt wird?

87
ngwdaniel

Gießen Sie sie in einen Integer-Typ (und Bitmaske entsprechend!).

#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;
}
9
sheu

Vielleicht das:

char c = 0xab;
std::cout << (int)c;

Ich hoffe es hilft.

6
Luka Pivk

Ein anderer Weg, dies zu tun, ist mit std :: hex abgesehen von casting (int) :

std::cout << std::hex << (int)myVar << std::endl;

Ich hoffe, es hilft.

0
omotto

Wie wäre es mit:

char c1 = 0xab;
std::cout << int{ c1 } << std::endl;

Es ist kurz und sicher und erzeugt den gleichen Maschinencode wie andere Methoden.

0
mt3d