Programmieren in C - hexadezimal einlesen und dezimal ausgeben
Hallo, ich bin am Anfang meines Studiums und habe einige Programmieraufgaben zu lösen. Es handelt sich nur um die Basics. Die Teilaufgabe lautet wie folgt:
"Speichern Sie das Ergebnis der Addition der beiden hexadezimalen Zahlen AA und BB in einer Variablen und geben Sie den berechneten Wert in dezimaler Schreibweise aus."
Was ich daraus gemacht habe:
char aa, bb, ergebnis;
aa = '0xAA'; // auch wenn ich 'AA' schreibe kommt kein Ergebnis
bb = '0xBB';
ergebnis = aa + bb;
printf("b) %d\n", ergebnis);
Herauskommt -157 aber eigentlich sollte +357 herauskommen.
Kann mir da jemand weiterhelfen.
Auch bei anderen Teilaufgaben kommen manchmal sehr komische Ergebnisse heraus.
Vielen Dank!
3 Antworten
Wieso sind aa und bb chars? Ich glaube da könnte dein Compiler Probleme bereiten.
Versuchs mal so und guck obs funktioniert (sollte es meiner Meinung nach, hab auch nicht mehr lange C gemacht):
int aa, bb, ergebnis;
aa = 0xAA;
bb = 0xBB;
ergebnis = aa + bb;
printf("b) %i\n", ergebnis);
Wenn das funktioniert, hat dein Compiler beim Typecasten rumgespackt, deshalb immer auf Variablentypen achten.
Hexadezimalzahlen sind ja auch Zahlen. Du kannst Zahlen auf drei verschiedene Weisen schreiben: Als Dezimalzahl, als Hexadezimalzahl und als Octalzahl (base 8).
Dezimalzahlen schreibst du ganz normal, Hexadezimalzahlen haben vorne "0x" und Octalzahlen nur eine 0 (z.B. 053). Das 0x und 0 sind nur Anweisungen an den Compiler, wie er die Zahlen interpretieren soll, rechnen tut er ganz normal wie mit allen anderen Zahlen auch (sie werden ja eh als Binärzahl in den Stack geschrieben von daher ist das Eingabezahlensystem nur dazu da, es für den Leser/Schreiber des Programms ersichtlicher zu machen, was passiert). Damit bleiben sie natürlich immernoch ints.
Der Compiler macht alles richtig, "char" ist halt üblicherweise nur 8 Bit groß und hat damit (signed) einen Wertebereich von -128 bis +127
Wenn man dann bei einer Zahl, die zwischen -128 und 127 liegen soll, -157 ausgibt, muss doch wohl etwas falsch sein. Egal was der Compiler gemacht hat, korrekt mit Chars gerechnet hat er zu 100% auch nicht ;) Das ist das Problem, wenn man den falschen Datentyp nimmt und dann rumgetypecastet wird, wo es nicht getan werden sollte.
Ihr habt recht und ich danke sehr für die zahlreichen und sehr aufklärenden Worte. Es funktioniert jetzt.
Du hast 2x den ASCII wert von ' aufeinanderaddiert und dann davon die letzten 8 Bit genommen.
Die variablen müssen interessant sein. Anführungszeichen um die zahlen weg.
Ich habe keine Umgebung zum Testen, aber ich möchte wetten, dass du statt '0xAA' besser 0xAA schreiben müsstest.
Hier steht auch, wie du sie umrechnen kannst: http://www.c-howto.de/tutorial-einfuehrung-hexadezimalsystem.html
Tipp: Gewöhne dir google-Techniken für dein Studium an.
Danke. Das habe ich auch gemacht und dann kommt +101 heraus. Ganz komische Nummer.
Das liegt am Datentyp. char kann nur 8Bit.
AA_16 + BB_16 = 1 0110 0101_2
Das sind 9 Bit. Lässt man das vordere Bit weg, kommt man auf 101_10
110 0101_2 = 101_10
So etwas kannst du super mit dem Windowstaschenrechner im Programmiermodus nachvollziehen. Du musst dir also 1*16² dazudenken.
Wow und dafür braucht mein Dozent Tage um das rüber zu bringen. Vielen Dank!
Vielen Dank, das war die Lösung. Aber ich habe doch Characters eingelesen und daher den char gewählt. Oder gilt der Inhalt bei 0x bzw Hochkommata als Zahl bzw etwas, das ein Integer verarbeiten kann.