C++ 如何使用ULARGE_整数执行arthemetic

C++ 如何使用ULARGE_整数执行arthemetic,c++,c,windows,winapi,C++,C,Windows,Winapi,我有一个应用程序,我不断地检查磁盘空间,并将其与特定值进行比较。现在,磁盘空间由以下公式计算: ULARGE_INTEGER p1; ULARGE_INTEGER p2; ULARGE_INTEGER p3; GetDiskFreeSpaceEx(".", &p1, &p2, &p3); 现在,通过上面的方法,我得到变量p3中的可用空间。现在我如何比较(算术运算)它和一个正常的整数值。此外,此代码必须在32位和64位平台上工作。或者是否有其他选项来计算可用磁盘空间?谢

我有一个应用程序,我不断地检查磁盘空间,并将其与特定值进行比较。现在,磁盘空间由以下公式计算:

ULARGE_INTEGER p1;
ULARGE_INTEGER p2;
ULARGE_INTEGER p3;
GetDiskFreeSpaceEx(".", &p1, &p2, &p3); 

现在,通过上面的方法,我得到变量p3中的可用空间。现在我如何比较(算术运算)它和一个正常的整数值。此外,此代码必须在32位和64位平台上工作。或者是否有其他选项来计算可用磁盘空间?谢谢

这是假设您的程序针对的是Win SDK中定义了
ULARGE_INTEGER
类型的窗口

ULARGE\u INTEGER
是一个包含
QuadPart
成员的并集,该成员是整数的64位值。所以,只要做一些类似的事情:

if (p1.QuadPart < p2.QuadPart) ...
if(p1.QuadPart

这也适用于32位版本,因为针对Win32的编译器已经支持64位整数类型很长一段时间了(可能是从Win32诞生以来)。ULARGE_integer是Windows API在编译器使用本机64位类型之前表示64位值的方式

今天,在Windows上使用VisualC++编译器,在<>代码> OLYGEGING *>代码>和64位本机类型(如<代码> UTIN64×T**/CODE >或<代码>未签名长L**/COD> > < P/>之间是安全的。

int compile_time_assert[(sizeof(ULARGE_INTEGER) == sizeof(unsigned long long)) ? 1 : -1];

unsigned long long freebytes = 0;
unsigned long long totalbytes = 0;
unsigned long long totalfree = 0;
GetDiskFreeSpaceEx(".", (ULARGE_INTEGER*)&freebytes, (ULARGE_INTEGER*)&totalbytes, (ULARGE_INTEGER*)&totalfree);
否则,如果你想避免施放黑客,你可以这样做:

ULARGE_INTEGER p1 = {0};
ULARGE_INTEGER p2 = {0};
ULARGE_INTEGER p3 = {0};
unsigned long long freebytes = 0;
unsigned long long totalbytes = 0;
unsigned long long totalfree = 0;
GetDiskFreeSpaceEx(".", &p1, &p2, &p3); 

freebytes = p1.QuadPart;
totalbytes = p2.QuadPart;
totalfree = p3.QuadPart;

如果这不是活动成员,则这是UB。根据C标准,它可能是UB,但对于Win32,它不是UB。关于“ULARGE_INTEGER是如何…Windows…表示64位值…在编译器使用本机64位类型之前…”的问题,看起来这是在Windows 95中引入的—在C99之前大约四年。它使用得更早吗?@chux-如果我记得的话,MSVC编译器在1998年Visual Studio 6.0期间引入了
\uuu int64
类型,很可能在C99之前
(U)一些API(如磁盘空间和
QueryPerformanceCounter
API)需要大整数。这些API可能存在于WindowsNT3.5时代(1994年)。