当前位置:C++技术网 > 资讯 > LARGE_INTEGER结构体使用详解

LARGE_INTEGER结构体使用详解

更新时间:2015-06-24 23:51:44浏览次数:1+次

   首先,介绍一下这个结构体出现的背景。

   Windows的设计允许我们处理非常大的文件。所以,自然使用的是64位来表示文件大小,而不是32位的。32位就是232 即4GB大小。如果文件超过4GB,我们用32位就表示不了,即超过4GB大小的字节,用32的数值无法索引到,一个数字对应一个字节的索引,超过4GB就超出了索引的范围。所以就增加索引数值的位数,就使用64位表示。

    64位数值表示的最大大小为(264 - 1)字节,最大可达16EB,就绰绰有余了。但是在32位系统中如何使用64位的类型呢?因为32位系统无法直接表示64位的大小类型,因此就借助各种机制拼凑出64位。基本方法就是用两个32位来组成一个64位,具体的组成方法就各不相同。本文就讲述LARGE_INTEGER这种结构体组合方式。

    然后介绍LARGE_INTEGER的使用和相关的信息。

    LARGE_INTEGER的原型大致声明如下:

  • LARGE_INTEGER有符号版本:
typedef union _LARGE_INTEGER
{
    struct
    {
        DWORD LowPart;  // - 低32位无符号数
        LONG    HighPart;  // - 高32位有符号数
    };
    LONGLONG QuadPart;// - 全64位有符号数
}LARGE_INTEGER, * PLARGE_INTEGER;
  • LARGE_INTEGER有符号版本:

typedef union _ULARGE_INTEGER
{
    struct
    {
        DWORD LowPart;  // - 低32位无符号数
        DWORD HighPart;  // - 高32位无符号数
    };
    ULONGLONG QuadPart;// - 全64位无符号数
}ULARGE_INTEGER, * PULARGE_INTEGER; 


    LARGE_INTEGER的有符号和无符号两个版本所占位数都是64位,如果需要表示更大的就请用无符号版本,如果有正负,则使用有符号版本。

LARGE_INTEGER结构体使用共用体定义,关于联合的详细讲解,请参考《宏、常量、枚举、结构体和共用体对比分析之共用体》 。

    在无符号版本中,不管是低32位还是高32位都是无符号,使用很方便,理解也很简单。但是在有符号版本中,低32位是无符号,高32位是有符号,全64位是有符号,这个要多解释一句。因为低32位与高32位拼接时,低32位只是当做其中一部分数据,每一位都表示数据,都是有效数据位,不需要符号位。而高32位是需要用符号位表示组合成的64位整体上的符号的,所以必须是有符号的。全64位则是用在不需要分开高低32位的场合中的。在有些场合中,低32位和高32位是分开接收得到的数据,以及分开传入到参数的,所以就不能用全64位表示。到时候大家使用到这个结构体时就很清楚了。

    这里就是一个简单的结构体而已,使用上还是要根据具体的函数。所以就不在这里一一列举了。熟悉这个结构体主要的两点就是共用体的使用和32位拼成64位的说明。

    如果大家有不清楚的,请留言。