Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben
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

Geschrieben
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]

Geschrieben

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]

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...