Средства разработки приложений


Азбука 64-разрядного программирования - часть 2


Каждый целочисленный тип явного представления имеет размер, соответствующий его определению. Это означает, что переменная типа int32 всегда будет занимать 32 разряда, вне зависимости от платформы, на которой запускается и исполняется код. Обратите внимание, что при следующем макросе ... #ifdef _WIN32 // Win32 код ...

под 32-разрядным кодом подразумевается использование 32-разрядных типов данных. Именно для переменных этой платформы служит тип int32. То же касается и других целочисленных типов явного представления, имеющих размер 32 разряда.

Второй вид (целочисленные типы, представленные указателями) имеет свою особенность: размер данных каждого такого типа зависит от платформы, на которой исполняется приложение. Именно поэтому многие из этих типов названы интегральными. Они сочетают в себе свойства 32- и 64-разрядных типов. Эти типы можно сравнить с виртуальными функциями и поздним связыванием из объектно-ориентированного программирования, так как в обоих случаях среда исполнения определяет конкретные свойства элементов только во время исполнения приложения, а не компиляции (в этом и заключается позднее связывание). Эти типы данных позволяют создавать приложения, одинаково хорошо работающие на 32- и 64-разрядной платформах.

Далее следуют указатели. При работе с ними надо соблюдать осторожность: необходимо учитывать разрядность данных, которые адресуются указателем, и помнить, что 32-разрядные указатели в 64-разрядном коде всегда расширяются операционной системой до нужного размера.

Следующие функции Win64 (Helper Functions) отвечают за преобразование одного типа в другой (эти inline-функции определены в Basetsd.h). Смысл многих из них понятен из определения прототипов, к остальным требуются объяснения:

  • unsigned long HandleToUlong( const void *h );
  • long HandleToLong( const void *h );
  • void *LongToHandle( const long h );
  • unsigned long PtrToUlong( const void *p );
  • unsigned int PtrToUint( const void *p );
  • unsigned short PtrToUshort( const void *p );
  • long PtrToLong( const void *p );
  • int PtrToInt( const void *p );
  • short PtrToShort( const void *p );
  • void * IntToPtr( const int i ) расширяет знаком (sign-extends) значение типа int;
  • void * UIntToPtr( const unsigned int ui) расширяет нулем (zero-extends) значение типа unsigned int;
  • void * LongToPtr( const long l ) расширяет знаком (sign-extends) значение типа long;
  • void * ULongToPtr( const unsigned long ul) расширяет нулем (zero-extends) значение типа unsigned long.

Теперь рассмотрим изменения в Win64 API.


Начало  Назад  Вперед



Книжный магазин