새 데이터 형식
새로운 데이터 형식에는 고정 정밀도 정수 형식, 포인터 정밀도 정수 형식 및 특정 정밀도 포인터 형식의 세 가지 클래스가 있습니다. 이러한 형식은 개발자가 도입되기 전에 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.