Discussion:
Windows: MAXDWORD+1 ?
(zu alt für eine Antwort)
ha
2015-05-19 06:28:45 UTC
Permalink
Hallo

Auf der Seite

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365740%28v=vs.85%29.aspx

sagt MS zur Berechnung der Filegrösse aus WIN32_FIND_DATA dies hier:

"The size of the file is equal to (nFileSizeHigh * (MAXDWORD+1)) +
nFileSizeLow."

Was soll "MAXDWORD+1" bedeuten ?

Zumal der VSE2013 hier erwartungsgemäss einen
"Überlauf einer ganzzahligen Konstanten" meldet.

MAXDWORD ist laut winnt.h = 0xffffffff

Kann mir jemand den Sinn der Addition von 1 erklären ?
Edzard Egberts
2015-05-19 08:00:59 UTC
Permalink
Post by ha
"The size of the file is equal to (nFileSizeHigh * (MAXDWORD+1)) +
nFileSizeLow."
Was soll "MAXDWORD+1" bedeuten ?
Zumal der VSE2013 hier erwartungsgemäss einen "Überlauf einer
ganzzahligen Konstanten" meldet.
MAXDWORD ist laut winnt.h = 0xffffffff
Kann mir jemand den Sinn der Addition von 1 erklären ?
Das ist so grundlegend, dass es fast schon wieder schwer zu erklären ist
- siehe Zahlensysteme und Stellenwertigkeit:

Du hast da eine positive ganze Zahl, die aus zwei "WORDS" (Microsprech
für 32bit unsigned int) besteht, die den High- und den Low-Teil der Zahl
angeben (zusammen also eine 64bit-Zahl darstellen).

Wenn Du zum Maximalwert des WORDs die Eins addierst, bekommst Du einen
Überlauf in die nächste Stelle 0x0_ffffffff -> 0x1_00000000, die der
kleinste Wert des HWORD (1) ist (die Unterstriche trennen die WORDs).
Anders gesagt hat das erste Bit des HWORDs die Wertigkeit 0x100000000
und nicht Eins, wie das erste Bit des LWORDs. Die 64bit-Gesamtzahl
entspricht also HWORD * 0x100000000 + LWORD, wie von Dir schon angegeben.

Im Dezimalsystem ist es das gleiche - wenn man zu 9 ("Max-Einerstelle")
eine 1 addiert, landet man bei 10, wobei die 1 der 10 dann die
Wertigkeit "Max-Einerstelle plus Eins" hat, 20 dann 2* (Max-Einerstelle
plus Eins) entspricht, usw.
ha
2015-05-19 09:58:16 UTC
Permalink
Danke für die Antwort. Die MS-Formel funktioniert jedenfalls
nicht. Der High-Anteil wird dabei unterschlagen. Ich löse das
erstmal so:

INT64 tp64;

tp64 = (INT64)finddataS.nFileSizeHigh;
tp64 = tp64 << (sizeof(MAXDWORD) * 8);
tp64 |= finddataS.nFileSizeLow;
Edzard Egberts
2015-05-19 11:15:38 UTC
Permalink
Post by ha
Danke für die Antwort. Die MS-Formel funktioniert jedenfalls
nicht. Der High-Anteil wird dabei unterschlagen.
Da muss dann wahrscheinlich alles mit 64bit gerechnet werden, das kann
schon schief gehen, wenn nur eine Variable 32bit hat.
Post by ha
INT64 tp64;
Guck' Dir doch mal die "stdint.h" an, wer MS-Datentypen verwendet, ist
eher Paläontologe als Programmierer.

Was Du eigentlich willst sieht damit so aus:

uint64_t tp64;
Post by ha
tp64 = (INT64)finddataS.nFileSizeHigh;
tp64 = tp64 << (sizeof(MAXDWORD) * 8);
tp64 |= finddataS.nFileSizeLow;
Kann man so machen, ich würde das aber auf "sizeof(DWORD)" ändern und
mich damit auf einen Typ und nicht einen Wert beziehen.

Loading...