die hexzahlen wieder
-
War das vorher ein integer-Wert?
Die simpelste Methode wäre es in dem Fall das einer Interger-Variable zuzuweisen. :p
-
string---> -123.456789
atof
Berechnung---> -80908641
Ausgabe Hex mit (%X) ---> FB2D6E9F (das ist auch richtig!!)
zurück in String
irgendwas damit machen
String FB2D6E9F in long int wandeln mit strtol(..........,16);
4214058655 rauskriegen ??????????
4214058655 != -80908641Mir ist bewusst, dass:
F: 15 · 1 = 15
9: 9 · 16 = 144
E: 14 · 256 = 3584
6: 6 · 4096 = 24576
13 · 65536 = 851968
2: 2 · 1048576 = 2097152
B: 11 · 16777216 = 184549376
F: 15 · 268435456 = 4026531840
———————————
4214058655
-
Was ist jetzt überhaupt das Problem
Bye, TGGC (Demo or Die)
-
ich möchte unbedingt den Anfangswert wieder herausbekommen -123.456789 bzw. -80908641 vor der Berechnung.
-
Dann speicher doch einfach eine Kopie der Zahl vor der Konvertierung ab.
Bye, TGGC (Demo or Die)
-
jo genau so mach ichs...

Ich lese einen eeprom aus...und woher soll ich denn wissen was da für eine Zahl rauskommt.
Solang die Zahlen positiv sind, funktionierts ohne Probleme.
Also nochmal die Grundproblematik:
z.b. -1 == FFFFFFFF
-2 == FFFFFFFE
-
Und?
Bye, TGGC (Demo or Die)
-
Denk doch mal nach! Die Werte sind bei jeder Elektronik anders!
Also dann ist es doch totaler Quatsch die Variable vorher zu speichern!
-
#include<cstdio> char text[12]; int num1=1378678,num2; sprintf(text,"%X",num1); sscanf(text,"%X",&num2);
-
Die erste Antwort von Mathias war gut.
#include <stdlib.h> #include <iostream> using namespace std; int main() { char* s = "FB2D6E9F"; char* tmp; long l = strtol( s, &tmp, 16); cout << l << " " << (int)l << endl; }
-
das klappt ja nicht, denn loopy will ja, daß das selbe rauskommt, das auch eingegeben wurde. aber nach konvertierung von FB2D6E9F nach int ist das ergebnis ja negativ.
-
Ich bezog mich auf
Ich muss doch aus dem String FB2D6E9F irgendwie wieder -80908641 machen können...?
Bekomme immer nur 4214058655 raus mit:long lDek = strtol(str25, &mystring, 16);
Niemand eine Ahnung?
-
ach so
na dann stimmts natürlich.
-
cout << l << " " << (int)l << endl;Ausgabe: 4214058655 4214058655
ist das nicht das selbe?
Bekommst du 4214058655 -80908641 raus?
-
sorry ich meinte: 2147483648
selbe Ausgabe auch bei "FFFFFFFF"
-
Yepp, ich bekomme die Zahl als long und als int angezeigt. Welcher Compiler, welches OS? Ist bei Dir sizeof(int) == 8 == sizeof(long)? Dann geht das bei Dir so nicht. Du musst in einen signed 4 Byte Datentyp casten.
-
XP und VC++6...
Kanns am Montag nochmal mit NT probieren und nochmal bescheid geben
-
VC++6 ist long == 32 Bit.
Wenn ich strtol ausprobiere bekomme ich immer LONG_MAX raus, was mit folgender Aussage aus der VC++6 übereinstimmt:
strtol returns the value represented in the string nptr, except when the representation would cause an overflow, in which case it returns LONG_MAX or LONG_MIN.Deine Zahl FB2D6E9F ist als positive Zahl für einen 31 Bit Wert (signed long) zu gross. In Deinem Fall ergibt:
#include <stdlib.h> #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { char* s = "FB2D6E9F"; char* tmp; unsigned long l = strtoul( s, &tmp, 16); cout << l << " " << (int)l << " " << endl; return 0; }das gewünschte Ergebnis.
Du siehst aber auch, dass diese Methode wenig portable ist und sehr leicht zerbricht.
-
Herzlichen Dank...der Samstagabend ist gerettet
!Wie sich das auf anderen Compilern bzw. Betriebssystemen verhält...teste ich dann morgen durch!
-
loopy schrieb:
Denk doch mal nach! Die Werte sind bei jeder Elektronik anders!
Also dann ist es doch totaler Quatsch die Variable vorher zu speichern!Echt bei jeder? Na dann pass aber auch auf, das aus 'ner 0 keine 2 wird und aus dem x kein a. Die Werte sind nämlich bei jeder Elektronik anders!
Bye, TGGC (Demo or Die)