For example,Бобцов

ON CONVERSION OF 32-DIGITS APPLICATIONS INTO 64-DIGITS

КРАТКИЕ СООБЩЕНИЯ

УДК 004.056.53 К ВОПРОСУ О ПЕРЕВОДЕ 32-х РАЗРЯДНЫХ ПРИЛОЖЕНИЙ В 64-х РАЗРЯДНЫЕ В.А. Безруков
Приведены рекомендации для перевода 32 разрядных приложений Windows в 64 разрядные. Ключевые слова: архитектура Intel 64, типы данных, size_t, ptrdiff_t, intptr_t и uintptr_t.
Данные, определения и рекомендации относятся только к архитектуре микропроцессора Intel 64. Почти все современные операционные системы имеют версии для архитектуры Intel 64.
Моделью данных для 64-битной операционной системы Windows является модель LLP64 (указатели имеют размер 64 бита). Для совместимости эта система поддерживает исполнение 32-битных программ, которые работают в режиме модели данных ILP32LL (типы int, long и указатели (pointers) имеют размер в 32 бита). Разница между 32-разрядной и 64-разрядной средами компиляции заключается в смене модели представления типов данных.
В общем виде перевод кода можно представить:  заменить функции Win32 API на их 64-разрядные варианты;  заменить типы данных в соответствии с заменяемой моделью.
Соответствующие API-функции Win32 необходимо заменить их 64-разрядными эквивалентами. Например, если в программе необходимо выбрать значение, связанное со структурой WNDCLASSEX, в виде дескриптора (указателя) следует использовать функцию GetClassLongPtr, а если изменить значения, то – функцию SetClassLongPtr. При этом в качестве второго параметра этих функций следует использовать значения, идентификаторы которых начинаются с префикса GCLP_, например, GCLP_WNDPROC – изменить адрес оконной процедуры, связанной с классом. Для выборки информации об окне или из дополнительной памяти окна в виде указателя следует применять функцию GetWindowLongPtr, а для изменения значения указателя, которое связано с окном, или значение, которое находится по заданному смещению в дополнительных данных окна – функцию SetWindowLongPtr. Для второго параметра этих функций следует использовать значения, идентификаторы которых начинаются с префикса GWLP_, например, GWLP_HINSTANCE – изменить дескриптор экземпляра приложения. Допустимые значения для диалоговых окон являются только значения, идентификаторы которых начинаются с префикса DWLP_ [Л].
В 64-битных приложениях предпочтительно использовать типы size_t, ptrdiff_t, INT_PTR, intptr_t и uintptr_t вместо 32-битных типов int и unsigned. Тип size_t – беззнаковый целый тип, например тип результата операции sizeof. На 32-битной системе size_t будет занимать 32 бита, а на 64-битной – 64 бита. Этот тип обычно применяется для счетчиков циклов и индексации массивов.
Для размещения указателей существует тип intptr_t (uintptr_t), который лучше выражает намерения и делает код более переносимым. Это целые типы со знаком (без знака), способные хранить указатели, размер которых определяется платформой, т.е. экземпляры этих типов или 32-разрядные или 64разрядные. Любой указатель на void может быть преобразован к этому типу. Тип ptrdiff_t – знаковый целый тип. На 32-битной системе ptrdiff_t будет занимать 32 бита, а на 64-битной – 64 бита. Тип ptrdiff_t, например, является результатом выражения, где один указатель вычитается из другого, а также применяется для счетчиков циклов, индексации массивов и адресной арифметики. В архитектуре Intel 64 размер size_t и ptrdiff_t совпадают с размером указателя, т.е. sizeof(size_t) = = sizeof(ptrdiff_t) = = sizeof(void *).
Чтобы получить имя константы, представляющей минимальное и максимальное значения указанных типов, необходимо в имени типа, заменить t на МАХ или MIN и перевести все символы в верхний регистр, например, максимально допустимым значением типа size_t является константа SIZE_MAX (stdint.h).
При создании 64-битных приложений, использование типов size_t, ptrdiff_t, INT_PTR, intptr_t и uintptr_t обеспечивает быстродействие, возможность работы с большими объемами данных, корректную адресную арифметику, а также позволяют писать переносимый код.
[Л]. Саймон Р. Windows 2000 API. Энциклопедия программиста: Пер. с англ. – Киев: СПб: ООО «ДиаСофтЮП», 2002. – 1088 с.
Безруков Вячеслав Алексеевич – Санкт-Петербургский государственный университет информационных технологий, механики и оптики, кандидат техн. наук, доцент, bezrukov@mail.ifmo.ru

Научно-технический вестник Санкт-Петербургского государственного университета информационных технологий, механики и оптики, 2010, № 4(68)

133