새 데이터 형식

새로운 데이터 형식에는 고정 정밀도 정수 형식, 포인터 정밀도 정수 형식 및 특정 정밀도 포인터 형식의 세 가지 클래스가 있습니다. 이러한 형식은 개발자가 도입되기 전에 64비트 Windows를 준비할 수 있도록 Windows 환경(특히 Basetsd.h)에 추가되었습니다. 이러한 새 형식은 기본 C 언어 정수 및 긴 형식에서 파생되었으므로 기존 코드에서 작동합니다. 따라서 지금 코드에서 이러한 데이터 형식을 사용하고, 32비트 Windows에서 코드를 테스트하고, 64비트 컴파일러를 사용하여 이식성 문제를 미리 찾아 수정하므로 64비트 Windows를 테스트할 수 있을 때 드라이버를 준비할 수 있습니다.

또한 이러한 새 데이터 형식을 채택하면 코드가 더욱 강력해질 수 있습니다. 이러한 데이터 형식을 사용하려면 잠재적으로 안전하지 않은 포인터 사용, 다형성 및 데이터 정의에 대한 코드를 검사해야 합니다. 안전하려면 새 형식을 사용합니다. 예를 들어 변수가 ULONG_PTR 형식인 경우 산술 연산 또는 다형성에 대한 포인터를 캐스팅하는 데 사용할 것이 분명합니다. 네이티브 Win32 데이터 형식을 사용하여 이러한 사용을 직접 나타낼 수 없습니다. 파생 형식 명명 또는 헝가리어 표기법을 사용하여 이 작업을 수행할 수 있지만 두 기술 모두 오류가 발생하기 쉽습니다.

Fixed-Precision 정수 형식

고정 정밀도 데이터 형식은 32비트 및 64비트 프로그래밍의 길이와 동일합니다. 이를 기억하기 위해 전체 자릿수는 데이터 형식의 이름에 속합니다. 고정 정밀도 데이터 형식은 다음과 같습니다.

Type 정의

DWORD32

32비트 부호 없는 정수

DWORD64

64비트 부호 없는 정수

INT32

32비트 부호 있는 정수

INT64

64비트 부호 있는 정수

LONG32

32비트 부호 있는 정수

LONG64

64비트 부호 있는 정수

UINT32

서명되지 않은 INT32

UINT64

서명되지 않은 INT64

ULONG32

서명되지 않은 LONG32

ULONG64

서명되지 않은 LONG64

Pointer-Precision 정수 형식

포인터 전체 자릿수가 변경되면(즉, 32비트 플랫폼용으로 컴파일될 때 32비트, 64비트 플랫폼용으로 컴파일될 때 64비트) 이러한 데이터 형식은 그에 따라 정밀도를 반영합니다. 따라서 포인터 산술 연산을 수행할 때 이러한 형식 중 하나에 포인터를 캐스팅하는 것이 안전합니다. 포인터 정밀도가 64비트이면 형식은 64비트입니다. 개수 형식은 포인터가 참조할 수 있는 최대 크기도 반영합니다. 다음은 포인터 정밀도 및 개수 형식입니다.

Type 정의

DWORD_PTR

포인터 정밀도에 대한 부호 없는 long 형식입니다.

HALF_PTR

반 포인터 정밀도에 대한 부호 있는 정수 형식(32비트 시스템의 경우 16비트, 64비트 시스템의 경우 32비트).

INT_PTR

포인터 정밀도에 대한 부가 정수 형식입니다.

LONG_PTR

포인터 정밀도에 대한 부가된 long 형식입니다.

SIZE_T

포인터가 참조할 수 있는 최대 바이트 수입니다. 포인터의 전체 범위에 걸쳐야 하는 개수에 이 형식을 사용합니다.

SSIZE_T

서명된 SIZE_T.

UHALF_PTR

서명되지 않은 HALF_PTR.

UINT_PTR

서명되지 않은 INT_PTR.

ULONG_PTR

서명되지 않은 LONG_PTR.

Fixed-Precision 포인터 형식

포인터의 크기를 명시적으로 지정하는 새 포인터 형식도 있습니다. 64비트 코드에서 이러한 포인터 형식을 사용할 때 주의해야 합니다. 32비트 형식을 사용하여 포인터를 선언하면 시스템에서 64비트 포인터를 잘려 포인터를 만듭니다.

Type 정의

POINTER_32

32비트 포인터입니다. 32비트 시스템에서는 네이티브 포인터입니다. 64비트 시스템에서는 잘린 64비트 포인터입니다.

POINTER_64

64비트 포인터입니다. 64비트 시스템에서는 네이티브 포인터입니다. 32비트 시스템에서는 기호 확장 32비트 포인터입니다.

높은 포인터 비트의 상태를 가정하는 것은 안전하지 않습니다.

도우미 함수

다음 인라인 함수(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 )
void * UIntToPtr( const unsigned int ui )
void * LongToPtr( const long l )
void * ULongToPtr( const unsigned long ul )

경고IntToPtr sign-extends the int value, UIntToPtr zero-extends the unsigned int value, LongToPtr sign-extends the long value, ULongToPtr zero-extends the unsigned long value.