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
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
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
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]
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]
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
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.
Cool-Matthias Geschrieben 27. Januar 2003 Autor Geschrieben 27. Januar 2003 Hi, danke für die Antworten. Hab soweit alles hinbekommen.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden