关于ULARGE_INTEGER 在计算磁盘容量时候的运算
来源:互联网 发布:三级数据库历年真题 编辑:程序博客网 时间:2024/04/29 00:46
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 theLowPart 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";//磁盘剩余容量}elsecout<<"设备为准备好";cout<<endl;}
- 关于ULARGE_INTEGER 在计算磁盘容量时候的运算
- 关于ULARGE_INTEGER的运算!
- 磁盘容量的计算
- 磁盘容量的计算
- ULARGE_INTEGER运算
- ULARGE_INTEGER运算
- 磁盘容量计算
- 关于linux在VM如何扩充磁盘容量操作说明
- Java和guava关于hashmap在初始化的时候最好给个初始容量
- 系分考试知识点-磁盘容量计算
- ULARGE_INTEGER
- 磁盘与目录的容量
- 在计算页面布局变化,特别是旋转的时候多用三目运算符
- 关于磁盘的概念和计算
- 图片容量的计算
- redhat在vm扩展磁盘容量
- Java和guava关于hashmap在初始化的时候最好给个初始容量,避免扩容引起性能问题的探究。
- 各种分区格式的磁盘容量限制
- 用链表集合模拟一个栈
- 【转】ubuntu下安装subversion客户端及使用方法
- 获得linux的系统时间
- xcode4中使用静态库和工作区
- 如何得到服务器端sql执行脚本的方法
- 关于ULARGE_INTEGER 在计算磁盘容量时候的运算
- JAVA实现 输入一串数字,转换成汉字显示
- c++ xcode提示错误:"vtable for UIPersonListView", referenced from:
- sprintf()、 strcpy()和memcpy()函数比较
- MySQL中information_schema
- mysql导入导出小经验
- C#中的泛型,与java。C++中泛型的区别
- Android电话系统rild-启动流程
- solaris 编译socket程序