關於ULARGE_INTEGER的運算!

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)直接計算。。。

發佈了16 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章