Bagikan melalui


Jenis Data Baru

Ada tiga kelas jenis data baru: jenis bilangan bulat presisi tetap, jenis bilangan bulat presisi penunjuk, dan jenis pointer presisi tertentu. Jenis-jenis ini ditambahkan ke lingkungan Windows (khususnya, ke Basetsd.h) untuk memungkinkan pengembang mempersiapkan Windows 64-bit sebelum diperkenalkan. Jenis baru ini berasal dari bilangan bulat bahasa C dasar dan jenis panjang, sehingga berfungsi dalam kode yang ada. Oleh karena itu, gunakan jenis data ini dalam kode Anda sekarang, uji kode Anda pada Windows 32-bit, dan gunakan pengkompilasi 64-bit untuk menemukan dan memperbaiki masalah portabilitas terlebih dahulu, sehingga driver Anda dapat siap ketika Windows 64-bit tersedia untuk pengujian.

Selain itu, mengadopsi jenis data baru ini akan membuat kode Anda lebih kuat. Untuk menggunakan jenis data ini, Anda harus memindai kode Anda untuk penggunaan pointer, polimorfisme, dan definisi data yang berpotensi tidak aman. Agar aman, gunakan jenis baru. Misalnya, ketika variabel berjenis ULONG_PTR, jelas bahwa variabel tersebut akan digunakan untuk transmisi pointer untuk operasi aritmatika atau polimorfisme. Tidak dimungkinkan untuk menunjukkan penggunaan tersebut secara langsung dengan menggunakan jenis data Win32 asli. Anda dapat melakukan ini dengan menggunakan penamaan jenis turunan atau notasi Hungaria, tetapi kedua teknik tersebut rentan terhadap kesalahan.

Tipe Bilangan Bulat Fixed-Precision

Jenis data presisi tetap memiliki panjang yang sama untuk pemrograman 32-bit dan 64-bit. Untuk membantu Anda mengingat hal ini, presisinya adalah bagian dari nama jenis data. Berikut ini adalah jenis data presisi tetap.

Jenis Definisi

DWORD32

Bilangan bulat tidak bertanda 32-bit

DWORD64

Bilangan bulat tidak bertanda 64-bit

INT32

Bilangan bulat bertanda 32-bit

INT64

Bilangan bulat bertanda 64-bit

LONG32

Bilangan bulat bertanda 32-bit

LONG64

Bilangan bulat bertanda 64-bit

UINT32

INT32 tidak ditandatangani

UINT64

INT64 tidak ditandatangani

ULONG32

LONG32 tidak ditandatangani

ULONG64

LONG64 tidak ditandatangani

Tipe Bilangan Bulat Pointer-Precision

Ketika presisi pointer berubah (yaitu, karena menjadi 32 bit ketika dikompilasi untuk platform 32-bit, 64 bit ketika dikompilasi untuk platform 64-bit), jenis data ini mencerminkan presisi yang sesuai. Oleh karena itu, aman untuk mentransmisikan pointer ke salah satu jenis ini saat melakukan aritmatika pointer; jika presisi pointer adalah 64 bit, jenisnya adalah 64 bit. Jenis hitungan juga mencerminkan ukuran maksimum yang dapat dirujuk oleh penunjuk. Berikut ini adalah jenis presisi dan hitungan pointer.

Jenis Definisi

DWORD_PTR

Jenis panjang yang tidak ditandatangani untuk presisi penunjuk.

HALF_PTR

Jenis integral yang ditandatangani untuk presisi setengah titik (16 bit pada sistem 32-bit, 32 bit pada sistem 64-bit).

INT_PTR

Jenis integral yang ditandatangani untuk presisi penunjuk.

LONG_PTR

Jenis panjang yang ditandatangani untuk presisi pointer.

SIZE_T

Jumlah maksimum byte yang dapat dirujuk oleh pointer. Gunakan jenis ini untuk hitungan yang harus mencakup rentang penuh penunjuk.

SSIZE_T

Ditandatangani SIZE_T.

UHALF_PTR

HALF_PTR yang tidak ditandatangani.

UINT_PTR

INT_PTR yang tidak ditandatangani.

ULONG_PTR

LONG_PTR yang tidak ditandatangani.

Jenis Penunjuk Fixed-Precision

Ada juga jenis pointer baru yang secara eksplisit mengukur pointer. Berhati-hatilah saat menggunakan jenis pointer ini dalam kode 64-bit: Jika Anda mendeklarasikan pointer menggunakan jenis 32-bit, sistem membuat pointer dengan memotong pointer 64-bit.

Jenis Definisi

POINTER_32

Penunjuk 32-bit. Pada sistem 32-bit, ini adalah pointer asli. Pada sistem 64-bit, ini adalah penunjuk 64-bit terpotok.

POINTER_64

Penunjuk 64-bit. Pada sistem 64-bit, ini adalah penunjuk asli. Pada sistem 32-bit, ini adalah penunjuk 32-bit yang diperluas tanda tangan.

Perhatikan bahwa tidak aman untuk mengasumsikan status bit pointer tinggi.

Fungsi Pembantu

Fungsi sebaris berikut (ditentukan dalam Basetsd.h) dapat membantu Anda mengonversi nilai dengan aman dari satu jenis ke jenis lainnya:

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 )

PeringatanMasuk IntToPtr memperluas nilai int , UIntToPtr nol-memperluas nilai int yang tidak ditandatangani, tanda LongToPtr memperluas nilai panjang , dan ULongToPtr nol-memperluas nilai panjang yang tidak ditandatangani .