ULARGE_INTEGER Union
The ULARGE_INTEGER structure is used to specify a 64-bit unsigned integer value.
typedef union _ULARGE_INTEGER {
struct {
DWORD LowPart;
DWORD HighPart;
};
struct {
DWORD LowPart;
DWORD HighPart;
} u;
ULONGLONG QuadPart; } ULARGE_INTEGER,
*PULARGE_INTEGER;
Members
-
LowPart
-
Low-order 32 bits.
HighPart
-
High-order 32 bits.
u
-
-
LowPart
-
Low-order 32 bits.
HighPart
-
High-order 32 bits.
QuadPart
-
-
Unsigned 64-bit integer.
Remarks
The ULARGE_INTEGER structure is actually a union. If your compiler has built-in support for 64-bit integers, use the QuadPart member to store the 64-bit integer. Otherwise, use the LowPart and HighPart members to store the 64-bit integer.
Header | Declared in Winnt.h; include Windows.h |
---|
上面是MSDN上的说明!
############################################################
由于在32位PC上无法int最大值为2^32,所以,对于64位数的存放采取了这样一种数据结构,假如我们要对这个64位的数字进行运算的话应该怎么办呢?
例如 使用BOOL GetDiskFreeSpaceEx() 获得磁盘信息时候
PULARGE_INTEGER FreeBytesAvailableToCaller;
……
BOOL GetDiskFreeSpaceEx(
LPCWSTR lpDirectoryName,
PULARGE_INTEGER lpFreeBytesAvailableToCaller,
PULARGE_INTEGER lpTotalNumberOfBytes,
PULARGE_INTEGER lpTotalNumberOfFreeBytes
)
获取了磁盘空间之后,由于得到的值是以字节为单位的,这里,我们想将其转化为以G为单位的。。
方法1:
(float)FreeBytesAvailableToCaller。HighPart<<2+(float)FreeBytesAvailableToCaller。LowPart/(1024*1024*1024);
原理: 首先,在计算机中所有数字都是以二进制存储的,HighPart是高32位,LowPart是低32位,摒弃你脑袋里的10进制概念,将这两部分均以2进制的视角来看。。。1G是2^30字节,所以低32位再除以2^30后,低32位的高2位仍未改变(切记是二进制的视角)。。同理,高32位的每位在计算后也肯定不会改变,即30位以后的都不作改变,所以将30位之后的所有二进制位整合,就可以得到整个64位数除以2^30的二进制整数部分结果了,这里(float)FreeBytesAvailableToCaller。HighPart<<2即空出俩位与后32位的高2位整合(HighPart<<2可以用*4代替)。。。
方法2:(float)FreeBytesAvailableToCaller。.QuadPart/(1024*1024*1024)直接计算。。。