Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Large_integer

Empfohlene Antworten

Veröffentlicht

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

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

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

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]

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]

Originally posted by maxim_42

Das tut's so nicht.

Warum funktioniert das Original nicht ? Ich bin der Meinung, dass es funktioniert.

Frank

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.

Hi,

danke für die Antworten.

Hab soweit alles hinbekommen.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.