关于ULARGE_INTEGER 在计算磁盘容量时候的运算

ULARGE_INTEGER Union

http://blog.csdn.net/erenno1/article/details/4672219

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

 

 

 

 

以下是我的实际代码:

 

 

	void GetDiskFreeSpaceEx(LPCTSTR lpDirectoryName)
	{
		BOOL fResult=::GetDiskFreeSpaceEx(lpDirectoryName,
			(PULARGE_INTEGER)&m_i64FreeBytesToCaller,
			(PULARGE_INTEGER)&m_i64TotalBytes,
			(PULARGE_INTEGER)&m_i64FreeBytes);
		if(fResult)
		{
			m_i64FreeBytesToCaller=(float)(((PULARGE_INTEGER)&m_i64FreeBytesToCaller)->HighPart<<2)+(float)((PULARGE_INTEGER)&m_i64FreeBytesToCaller)->LowPart/(1024*1024*1024);
			m_i64TotalBytes=(float)(((PULARGE_INTEGER)&m_i64TotalBytes)->HighPart<<2)+(float)((PULARGE_INTEGER)&m_i64TotalBytes)->LowPart/(1024*1024*1024);
			cout<<"totalspace:"<<m_i64TotalBytes<<"GB"<<endl;//磁盘总容量
			cout<<"freespace:"<<m_i64FreeBytesToCaller<<"GB";//磁盘剩余容量
		}
		else
			cout<<"设备为准备好";
		cout<<endl;
	}


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值