C: Frage zu 64bit-Arithmetik in diesem Code

HoPi

Mitglied
Hi ihr,
habe eine Aufgabe gestellt bekommen, in der ein Programm in C geschrieben werden soll, dass den aktuellen Speicherplatz aller Festplatten ausgeben soll. Es soll nur unter Windows lauffähig sein, also können Windows-APIs benutzt werden. Ich hab mir nun nach etlichen Stunden Suche und probieren folgenden Code zusammengeschustert:

Code:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h> 
#define E32 ((double)4294967296.)

typedef struct int64s {
unsigned long Low, High;
} int64t;

void main(void)
{
   char szBuffer[MAX_PATH+100];

   UINT nDrive = 0;
   DWORD dwLogicalDrives = GetLogicalDrives();

   for(nDrive=2; nDrive<30; nDrive++)
   {
      if(dwLogicalDrives & (1<<nDrive))
      {
         UINT uType;
         int64t i64TotalBytes;
         int64t i64NumberOfFreeBytes;
         int64t i64FreeBytesAvailable;
         int fResult;

         wsprintf( szBuffer, "%c:\\", nDrive+'A' );
         uType = GetDriveType(szBuffer);

         if(uType == DRIVE_FIXED) {
            fResult = GetDiskFreeSpaceEx(szBuffer,
               (PULARGE_INTEGER)&i64FreeBytesAvailable,
               (PULARGE_INTEGER)&i64TotalBytes,
               (PULARGE_INTEGER)&i64NumberOfFreeBytes);
            if(fResult)
               printf("HD %s: Gesamt: %.2f GB\n        davon verfuegbar: %.2f GB\n",
                  szBuffer,
                  ((double)i64TotalBytes.High*E32 +
                     i64TotalBytes.Low)/(1024*1024*1024),
                  ((double)i64FreeBytesAvailable.High*E32 +
                     i64FreeBytesAvailable.Low)/(1024*1024*1024));
         }
      }
   }
}
Mir ist auch soweit klar, was der Code macht - halbwegs verstanden hab ich ihn ;)
Was mir noch schleierhaft ist: was genau macht diese 64bit-Arithmetik? Wieso High und Low? Wozu *E32? Wäre nett, wenn mir das jemand erklären könnte oder Links posten könnte, wo ich was darüber lesen kann... muss ehrlich sagen, dass ich nach den letzten Stunden rumdoktorn erstmal die Motivation verloren hab und jetzt 'ne Rumgoogle-Pause mache :)

//edit
Was mir gerade auffällt: warum ist nDrives vom Typ UINT?
 
Diese 64-Bit Arithmetik ist da, weil die Größe des freien Speicherplatzes >= 2^32 sein kann und damit einen 32-Bit Integer sprengen würde.
Wieso High und Low?
Da wird ein Struct erzeugt, das aus 2 32-Bit-Integers besteht, um eine 64-Bit-Integerzahl zu speichern. 'High' enthält die oberen 32 Bit, 'Low' die unteren 32 Bit.
Das macht das gleiche wie ein '<< 32'. Da Du ja 2 32-Bit Integers hast, mußt Du, um die eigentliche Zahl zu erhalten, das High-DWORD wieder um 32 Bit nach links schieben.
 
Zurück