Simple multiplikations Frage
-
Hallo zusammen, kann mir einer von euch mal bitte verraten warum folgern quelltext nicht zum gewünschten Ergebnis fürht:
int potenz(int x, int n) { int zahl2 = 1; for(int i=0;i<n;i++) { zahl2*=x; } return zahl2; } void convertHexNumber() { int ergebnis = 0; string zahl; cout << "Bitte eine Hex Zahl eingeben: "; cin >> hex; int index = 0; for(int i = hex.length() - 1; i >= 0; i--) { ........ ....... ergebnis += potenz(16,index) * hex[i]; } index++; } cout << "Dezimal Zahl :" << ergebnis; }so wenn ich nun in der Fkt convertHexNumber die 5 eingebe dann bekomme ich von dieser Rechnung hier das Ergbnis (potenz(16,index) * hex[i]) = 53 und nicht wie gewollt 5. Wenn ich mir die Teilergebnisse ausgeben lasse dann kommt da 1*5 = 53 raus. gut ich dachte mir vielleicht liegts daran das es ein string ist den ich eingebe in der Konsole deshalb hab ich hex[i] mal auf int gecastet mit static_cast<int>(hex[i]) aber auch das hat nichts geholfen?
Kann mir einer bitte sagen wo hier der Fehler liegt, ist bestimmt irgendwas ganz banales, aber ich seh es nicht.
Danke.
-
In den meisten Fällen entspricht
'0'nicht 0, sondern dem Wert 48.'5'entspricht meistens dem Wert 53. Meistens daher, weil dazu der ASCII Zeichensatz genommen wird:
http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange#ASCII-TabelleWas hättest du eigentlich erwartet, wenn
hex[i]auf einen Buchstaben verwiesen hätte, zum Beispiel'A'?
Grüssli
-
ja wo ist dann genau der Fehler?
Also ebtspricht mein Ergebnis 5 dem Ascii zeichen 53, und deshalb gibt er das aus? Wie mache ich es denn das dann auch die 5 stehen bleibt?
-
Shaguar schrieb:
ja wo ist dann genau der Fehler?
Der Fehler ist, dass du annimmst, dass '5' gleich 5 ist. Dem ist aber nicht der Fall. Das Zeichen 5 hat meistens in den verschiedenen Zeichensätzen nicht den Wert 5. Unter ASCII entspricht das Zeichen 5 eben dem Wert 53.
Shaguar schrieb:
Also ebtspricht mein Ergebnis 5 dem Ascii zeichen 53, und deshalb gibt er das aus? Wie mache ich es denn das dann auch die 5 stehen bleibt?
Die Sache zuerst umwandeln?
Allerdings gibt es für das Einlesen von Hexadezimalziffern gleich C++ Funktionen:#include <iostream> int main() { long hex; std::cout << "Hexzahl eingeben: " std::cout.flush(); while(!(std::cin >> std::hex >> hex)) { std::cout << "Eingabe ungültig!\n" "Probieren sie es erneut: "; std::cin.clear(); std::cin.ignore(std::cin.rdbuf()->in_avail()); std::cout.flush(); } return 0; }Referenz: http://www.cplusplus.com/reference/
Falls du es selber machen willst, dann würde sich vielleicht ein switch-statement anbieten:
switch(hex[i]) { case '0' : // ... break; case '1' : // ... break; /* ... */ case 'E' : case 'e' : // ... break; case 'F' : case 'f' : // ... break; default : // ... }Oder falls du dich darauf verlassen kannst, dass es sich um ein ASCII Zeichensatz handelt, dann wäre auch die Subtraktion eine Idee:
if(hex[i] >= '0' && hex[i] <= '9') { value = hex[i] - '0'; } else if(hex[i] >= 'A' && hex[i] <= 'F') { value = hex[i] - 'A' + 10; } else { // Fehler? }Grüssli
-
Ist das hier Absicht?
string zahl;cin >> hex;void convertHexNumber() { int ergebnis = 0; string zahl; cout << "Bitte eine Hex Zahl eingeben: "; cin >> hex; int index = 0; for(int i = hex.length() - 1; i >= 0; i--) {
-
ups, ne das is keine absicht, aber das steht auch nur hier im forum, bei mir im Quelltext hab ich das schon richtig stehen.
Aber ich werd jetzt erstmal die verschiedenen Möglichkeiten durchprobieren.
Danke erstmal.