2013-02-16 67 views
4

http://msdn.microsoft.com/en-us/library/windows/desktop/aa383742%28v=vs.85%29.aspxULARGE_INTEGER聯盟的要點是什麼?

它們應該像這樣使用,在LowPart和HighPart上設置兩個32位值,然後在QuadPart上執行算術運算。

int a,b,c; 
ULARGE_INTEGER u; 
... 
u.LowPart = a; 
u.HighPart = b; 
u.QuadPart += c; 

因此,如果你打算在QuadPart(64位)上執行算術,你需要一個64位處理器,對吧?那麼整點是什麼?爲什麼不直接將值分配給QuadPart?

回答

7

你並不需要一個64位處理器上的64位數據類型進行算術。我知道的所有32位編譯器都支持64位整數運算。如果硬件不允許本地算術,那麼編譯器必須生成代碼來進行算術運算。通常這會在編譯器的RTL中使用支持函數。

該結構旨在供不支持64位數據類型的編譯器使用。非常documentation給您鏈接使得清楚了:

注意你的C編譯器可以支持64位整數本身。例如,對於 示例,Microsoft Visual C++支持大小整數類型的__int64。 有關更多信息,請參閱C 編譯器隨附的文檔。

不支持本機64位整數的編譯器將無法將QUADPART聯合成員視爲整數。

typedef union _ULARGE_INTEGER { 
    struct { 
    DWORD LowPart; 
    DWORD HighPart; 
    }; 
    struct { 
    DWORD LowPart; 
    DWORD HighPart; 
    } u; 
    ULONGLONG QuadPart; 
} ULARGE_INTEGER, *PULARGE_INTEGER; 

ULONGLONG定義:

#if !defined(_M_IX86) 
typedef unsigned __int64 ULONGLONG; 
#else 
typedef double ULONGLONG; 
#endif 

當然,寫在過去的10年(含)以上所有的編譯器將有64位整數的原生支持。但是,這個聯盟最初是在很久以前推出的,編譯器的格局會不一樣。在查看Windows頭文件時,請始終牢記歷史和遺留問題。

+0

>不支持本機64位整數的編譯器將無法將QUADPART聯合成員視爲整數。 那麼當你在這樣的編譯器中做u.QuadPart + = c時會發生什麼? – Roland 2013-02-16 23:42:57

+2

從頭文件中讀取帶有#if的部分的引用文本。 – 2013-02-17 00:54:07

+0

@RaymondChen如果你執行'u.LowPart + = 100'並且它溢出,32位編譯器會發生什麼? – Roland 2017-08-07 05:15:02

4

典型地,當需要一對32位整數轉換成64位整數或反之亦然ULARGE_INTEGER被使用。

例如,考慮操縱FILETIME結構:

void add_millisecond(FILETIME * ft) 
{ 
    ULARGE_INTEGER uli; 
    uli.LowPart = ft->dwLowDateTime; 
    uli.HighPart = ft->dwHighDateTime; 
    uli.QuadPart += 10000; 
    ft->dwLowDateTime = uli.LowPart; 
    ft->dwHighDateTime = uli.HighPart; 
} 

您不能直接,因爲你沒有把它分配的QuadPart值;你所擁有的只是高低部分。

+0

'uli.QuadPart + = 10000;'此代碼不適用於不支持64位整數的編譯器,對不對? – Roland 2017-08-07 05:09:10

+0

在僅支持32位算術的編譯器上,您不能執行'uli.QuadPart + = 10000;'而必須按照此處所述執行操作:https://stackoverflow.com/a/45540114/480894 – Roland 2017-08-07 06:42:48

+0

@Roland,I我不知道任何只支持32位算法的現代Windows編譯器。 – 2017-08-07 07:38:03