Поделиться через


Новые типы данных

Для 64-разрядной версии Windows были представлены три класса типов данных: типы данных с фиксированной точностью, типы точности указателя и типы с определенной точностью указателя. Эти типы были добавлены в среду разработки, чтобы позволить разработчикам подготовиться к 64-разрядной версии Windows. Эти типы являются производными от базовых целочисленных и длинных типов языка C. Таким образом, эти типы данных можно использовать в коде, который компилируется и тестируется в 32-разрядной версии Windows, а затем повторно компилируется с помощью 64-разрядного компилятора при выборе 64-разрядной версии Windows.

Даже для приложений, предназначенных только для 32-разрядной версии Windows, применение этих новых типов данных повышает надежность кода. Чтобы использовать эти типы данных, необходимо проверить код на наличие потенциально небезопасного использования указателей, полиморфизма и определений данных. Например, если переменная имеет тип ULONG_PTR, ясно, что она будет использоваться для приведения указателей для арифметических операций или полиморфизма. Невозможно указать такое использование напрямую с помощью старых типов данных. (Это можно сделать косвенно с помощью производного именования типов или венгерской нотации, но оба метода подвержены ошибкам.)

Все эти типы данных объявляются в BaseTsd.h. Дополнительные сведения, включая определения этих типов данных, см. в разделе Типы данных Windows.

Фиксированная точность

Типы данных с фиксированной точностью имеют одинаковую длину в 32- и 64-разрядной версии Windows. Чтобы запомнить это, их точность является частью имени типа данных. Ниже приведены типы данных с фиксированной точностью.

Термин Описание
DWORD32
32-битное целое число без знака
DWORD64
64-битное целое число без знака
INT32
32-битное целое число со знаком
INT64
64-битное целое число со знаком
LONG32
32-битное целое число со знаком
LONG64
64-битное целое число со знаком
UINT32
Неподписанный INT32
UINT64
Неподписанный INT64
ULONG32
Unsigned LONG32
ULONG64
Unsigned LONG64

Точность указателя

По мере изменения точности указателя (то есть по мере того, как она становится 32 битами в 32-разрядной версии Windows и 64 битами в 64-разрядной версии Windows), типы данных точности указателя соответствующим образом отражают точность. Таким образом, при выполнении арифметики указателя можно с уверенностью привести указатель к одному из этих типов; Если точность указателя составляет 64 бита, тип равен 64 бита. Типы счетчиков также отражают максимальный размер, на который может ссылаться указатель. Ниже приведены типы точности указателя и счетчика.

Термин Описание
DWORD_PTR
Тип long без знака для точности указателя.
HALF_PTR
Половина размера указателя. Используйте в структуре, содержащей указатель и два небольших поля.
INT_PTR
Целочисленный тип со знаком для точности указателя.
LONG_PTR
Тип long со знаком для точности указателя.
SIZE_T
Максимальное число байтов, на которое может ссылаться указатель. Используйте для счетчика, которое должно охватывать весь диапазон указателя.
SSIZE_T
Подписанный SIZE_T.
UHALF_PTR
неподписанный HALF_PTR.
UINT_PTR
неподписанный INT_PTR.
ULONG_PTR
Неподписанный LONG_PTR.

Конкретные типы Pointer-Precision

Следующие новые типы указателей явно размер указателя. Будьте осторожны при использовании указателей в 64-разрядном коде. Если вы объявляете указатель с помощью 32-разрядного типа, операционная система создает указатель путем усечения 64-разрядного указателя. (Все указатели являются 64-разрядными в 64-разрядной версии Windows.)

Термин Описание
POINTER_32
32-разрядный указатель. В 32-разрядной версии Windows это собственный указатель. В 64-разрядной версии Windows это усеченный 64-разрядный указатель.
POINTER_64
64-разрядный указатель. В 64-разрядной версии Windows это собственный указатель. В 32-разрядной версии Windows это 32-разрядный указатель со знаком.
Обратите внимание, что небезопасно предполагать состояние бита верхнего указателя.