Новые типы данных
Для 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-разрядный указатель со знаком. Обратите внимание, что небезопасно предполагать состояние бита верхнего указателя. |