Frage um 0xFF
-
Hey ihr lieben,
ich habe in meinem C++ Buch ein Beispiel:
cout << "Wert von 0xFF" << 0xFF << " dezimal ";warum wird hier direkt der wert von 0xFF dezimal wiedergegeben und muss nicht erst umgewandelt werden mit << dec << 0xFF ?
Ausserdm würd mich interessieren ob ich mir das richtig erschließe das bei diesem Beispiel:
<< hex << 50;
die 50 in hex geschoben wird und daswegen so dargestellt werden kann ?
-
Fragäzeichen schrieb:
warum wird hier direkt der wert von 0xFF dezimal wiedergegeben und muss nicht erst umgewandelt werden mit << dec << 0xFF ?
Weil 0xFF ein Integerliteral ist. Und dem Compiler ist egal, wie diese Zahl zustande gekommen ist. Der Compiler sieht nur "oh, ein Integer", überführt* diesen in das eingestellte Zahlensystem (hier Dezimal) und gibt das dann aus.
* Aus dem Binärsystem. Du solltest dir mal veranschaulichen, wie der Computer Zahlen speichert, dann beantwortet sich die Frage auch von selbst.
Fragäzeichen schrieb:
die 50 in hex geschoben wird und daswegen so dargestellt werden kann ?
Nein. Alles wird in cout geschoben. Erst hex, (das setzt einen Status) und dann die 50.
-
Das es ein Integerliteral(konstant) ist, ist für mich klar, aber warum ist es einer der das dezimalsystem zur basis nimmt,
Ich dachte es wäre eine hexadezimale Basis, weil hexadezimal ja immer 0x vorraussetzt..Hast du eine Quelle wie ich mir das gut veranschaulichen kann ?
Danke für deine hilfe!
-
Du hast da eine falsche Vorstellung. Das "0x" bedeutet nur, dass das folgende vom hexadezimalen System in das native (wohl Binär) System umgewandelt wird. Es hat keinen Einfluss auf den Programmablauf. Der Compiler wandelt diese Zahl während des Kompilierens vollständig um. Mit diesem Wert wird dann der operator << aufgerufen (zur Laufzeit*), der nichts weiter macht, als die Zahl die er vorgesetzt bekommt in einen String umzuwandeln und auszugeben.
* Könnte theoretisch wohl optimiert werden, tut hier aber nichts zur Sache.
Vielleicht schreibst du einfach mal die C Funktion atoi() nach, danach sollte dir klar sein, was da passiert.
-
Ein Integerliteral ist einfach eine Zahl (in dem Fall 255) + Typ (in diesem Fall int).
Dieser Zahl/Typ Kombination haftet keinerlei zusätzliche Information an, also auch nicht wie du diese Zahl im Source-Code geschrieben hast.
Soll heissen: ob du jetzt 0xFF (hex) oder 255 (dezimal) oder 0377 (oktal) schreibst, ist vollkommen egal. Für den Compiler ist es immer nur ein "int" mit dem Wert 255.Theoretisch könntest du genau so gut auch "(127+128)" schreiben, oder "(2553/0xA)". Das Ergebnis wäre wieder nur ein "int" mit dem Wert 255.
Weiters wird mit den Modifiern "std::dec" und "std::hex" auch nichts umgewandelt. Damit wird dem Stream nur mitgeteilt, wie er Zahlen die man danach "reinschiebt" zu formatieren hat.
-
Danke sehr für eure Antworten

Habs endgültig verstanden.