2013-02-16 5 views
4

http://msdn.microsoft.com/en-us/library/windows/desktop/aa383742%28v=vs.85%29.aspxКакой смысл союза ULARGE_INTEGER?

Они должны быть использованы, как это, установить два 32 битовых значений на LowPart и HighPart, а затем выполнить арифметические операции на 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

+2

Прочитайте цитированный текст из файла заголовка, часть с #if. –

+0

@RaymondChen Что произойдет с 32-битным компилятором, если вы делаете 'u.LowPart + = 100' и ​​переполняется? – Roland

3

Так что, если вы собираетесь выполнять арифметические операции на QuadPart (64 бит) в любом случае вам нужно 64 битный процессор, не так ли?

Нет. Но реальный вопрос должен быть, нужен ли вам компилятор, поддерживающий 64-битный целочисленный тип? Ответ на это тоже в этом случае - нет. Именно эти функции для:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa383711%28v=vs.85%29.aspx

4

Обычно ULARGE_INTEGER используется, когда вам нужно преобразовать пару 32-разрядных целых чисел в 64-разрядное целое или наоборот.

Для примера рассмотрим манипулируя 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

+0

В компиляторах, которые поддерживают только 32-разрядную арифметику, вы не можете выполнять 'uli.QuadPart + = 10000;' и вместо этого должны делать так, как описано здесь: https://stackoverflow.com/a/45540114/480894 – Roland

+0

@Roland, I «Не знаю современных компиляторов Windows, которые поддерживают только 32-разрядную арифметику. –

Смежные вопросы