Cool-Matthias Geschrieben 22. Januar 2003 Geschrieben 22. Januar 2003 Hi, hab mal ne kleine Frage. Ich will zu einem LARGE_INTEGER eine Zahl (64000) addieren. Gibts da eine API-Funktion für sowas? Oder was muss ich wie alles umrechnen, damit alle Elemente der LARGE_INTEGER Struktur wieder stimmen? Mfg Matthias Zitieren
Cool-Matthias Geschrieben 22. Januar 2003 Autor Geschrieben 22. Januar 2003 Hi, das Problem hab ich zwischenzeitlich gelöst: LARGE_INTEGER iStart; long lNew = iStart.LowPart+64000; if (lNew<iStart.LowPart) iStart.HighPart++; iStart.LowPart = lNew; Ich stehe aber schon vor dem nächsten. Ich muss jetzt ne Prozentzahl davon ausrechnen, als Beispiel 25% vom Wert. Hoffe irgendjemand kann mir helfen! Mfg Matthias Zitieren
SgtBadAzz Geschrieben 22. Januar 2003 Geschrieben 22. Januar 2003 Originally posted by Cool-Matthias Hi, das Problem hab ich zwischenzeitlich gelöst: LARGE_INTEGER iStart; long lNew = iStart.LowPart+64000; if (lNew<iStart.LowPart) iStart.HighPart++; iStart.LowPart = lNew; Ich stehe aber schon vor dem nächsten. Ich muss jetzt ne Prozentzahl davon ausrechnen, als Beispiel 25% vom Wert. Hoffe irgendjemand kann mir helfen! Mfg Matthias Nehemen wir mal an ich will 25% von 1100 ... und 1100 waere so ein RIESENINTEGER ... 1000 waere der hohe Teil und 25% davon sind 250, 100 waere der niedrige Teil und 25% davon sind 25 und 250 und 25 sind 275 und 275 sind 25% von 1100 ... oder ? Ich denke das kann man dann mit LowPart und HighPart auch so machen ... oder ? Frank Zitieren
maxim_42 Geschrieben 23. Januar 2003 Geschrieben 23. Januar 2003 Originally posted by Cool-Matthias Hi, das Problem hab ich zwischenzeitlich gelöst: LARGE_INTEGER iStart; long lNew = iStart.LowPart+64000; if (lNew<iStart.LowPart) iStart.HighPart++; iStart.LowPart = lNew; Das tut's so nicht. Versuchs mal hiermit: #include <stdio.h> #include <limits.h> int main() { typedef struct { unsigned LowPart; int HighPart; } LARGE_INTEGER; LARGE_INTEGER li; int idummy; int iWert=64000; li.LowPart =0xFFFFFFF0; li.HighPart=0; if(UINT_MAX-li.LowPart < iWert) { //Kompilerwarnung ist berechtigt. // Negative Werte für iWert werden // nicht berücksichtigt. li.HighPart++; //Übertrag idummy= (li.LowPart & 1) + (iWert & 1); /* Die Summe der ersten Bit sichern, weil sie gleich anschliesend rausgeschiftet werden.*/ li.LowPart >>= 1; iWert >>=1; /* Jeweils 1 nach rechts schiften, damit die Summe in 32 Bit passt.*/ li.LowPart += iWert; li.LowPart <<=1; li.LowPart+=idummy; } else { li.LowPart += iWert; } printf("li.LowPart: %i\nli.HighPart: %i\n",li.LowPart,li.HighPart); printf("iDummy: %i\n",idummy); return 0; }[/PHP] Zitieren
maxim_42 Geschrieben 23. Januar 2003 Geschrieben 23. Januar 2003 Nachtrag: Eigendlich kann man sich das Bitgeschiebe auch sparen, zumal der Fall, dass ein Überlauf erst bei der Addition der beiden ersten Bits auftritt nicht aufgefangen wird. Die Summe passt zwar garantiert nicht in 32 Bit , aber das Überlaufbit ist ja schon durch .HighPart++ berücksichtigt. Also: if(UINT_MAX-li.LowPart < iWert) { li.HighPart++; //Übertrag li.LowPart += iWert; } else { li.LowPart += iWert; } }[/PHP] Zitieren
SgtBadAzz Geschrieben 24. Januar 2003 Geschrieben 24. Januar 2003 Originally posted by maxim_42 Das tut's so nicht. Warum funktioniert das Original nicht ? Ich bin der Meinung, dass es funktioniert. Frank Zitieren
maxim_42 Geschrieben 24. Januar 2003 Geschrieben 24. Januar 2003 Um über die Notwendigkeit eines Übertrags in .HighPart zu entscheiden, musst du wissen ob die Summe aus dem zu addierenden Werts (hier 64000) und dem schon in .LowPart gespeicherten Wert grösser ist als der grösste unsigned Wert, der sich in 32 bit darstellen lässt. Deine Abfrage if (lNew<iStart.LowPart) entscheidet das aber nicht. Zitieren
Cool-Matthias Geschrieben 27. Januar 2003 Autor Geschrieben 27. Januar 2003 Hi, danke für die Antworten. Hab soweit alles hinbekommen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.