Nowe typy danych
Wprowadzono trzy klasy typów danych dla 64-bitowego systemu Windows: typy danych o stałej precyzji, typy precyzji wskaźnika i określone typy precyzji wskaźnika. Te typy zostały dodane do środowiska deweloperskiego, aby umożliwić deweloperom przygotowanie się do 64-bitowego systemu Windows. Te typy pochodzą z podstawowej liczby całkowitej języka C i typów długich. W związku z tym można używać tych typów danych w kodzie, który kompilujesz i testujesz na 32-bitowym systemie Windows, a następnie ponownie kompilować przy użyciu kompilatora 64-bitowego, kiedy programujesz dla 64-bitowego systemu Windows.
Nawet w przypadku aplikacji przeznaczonych tylko dla 32-bitowych systemów Windows wdrożenie tych nowych typów danych sprawia, że kod jest bardziej niezawodny. Aby użyć tych typów danych, należy przeskanować kod pod kątem potencjalnie niebezpiecznego użycia wskaźnika, polimorfizmu i definicji danych. Na przykład gdy zmienna ma typ ULONG_PTR, jest jasne, że będzie używana do rzutowania wskaźników dla operacji arytmetycznych lub polimorfizmu. Nie można wskazać takiego użycia bezpośrednio przy użyciu starszych typów danych. (Można to zrobić pośrednio przy użyciu nazewnictwa typów pochodnych lub notacji węgierskiej, ale obie techniki są podatne na błędy).
Wszystkie te typy danych są deklarowane w pliku BaseTsd.h. Aby uzyskać więcej informacji, w tym definicje tych typów danych, zobacz Typy danych systemu Windows.
Stała precyzja
Typy danych o stałej precyzji mają taką samą długość zarówno w 32-, jak i 64-bitowych systemach Windows. Aby to ułatwić zapamiętanie, ich precyzja jest częścią nazwy typu danych. Poniżej przedstawiono typy danych o stałej precyzji.
Termin | Opis |
---|---|
DWORD32 |
32-bitowa liczba całkowita bez znaku |
DWORD64 |
64-bitowa liczba całkowita bez znaku |
INT32 |
32-bitowa liczba całkowita ze znakiem bitowym |
INT64 |
64-bitowa liczba całkowita ze znakiem |
LONG32 |
32-bitowa liczba całkowita ze znakiem |
LONG64 |
64-bitowa liczba całkowita ze znakiem |
UINT32 |
Niepodpisane INT32 |
UINT64 |
Typ niesygnowany INT64 |
ULONG32 |
Niepodpisane LONG32 |
ULONG64 |
Niepodpisane LONG64 |
Precyzja wskaźnika
Ponieważ precyzja wskaźnika zmienia się (to znaczy, gdy staje się 32 bity w 32-bitowych systemach Windows i 64 bity w 64-bitowych), typy danych precyzji wskaźnika odzwierciedlają tę precyzję. W związku z tym można bezpiecznie rzutować wskaźnik na jeden z tych typów podczas wykonywania arytmetyki wskaźnika; jeśli precyzja wskaźnika wynosi 64 bity, typ ma 64 bity. Typy liczników odzwierciedlają również maksymalny rozmiar, do którego może odwoływać się wskaźnik. Poniżej przedstawiono typy precyzji wskaźnika i typy liczników.
Termin | Opis |
---|---|
DWORD_PTR |
Niepodpisany długi typ dla precyzji wskaźnika. |
HALF_PTR |
Połowa rozmiaru wskaźnika. Użyj w strukturze zawierającej wskaźnik i dwa małe pola. |
INT_PTR |
Typ liczby całkowitej ze znakiem dopasowany do precyzji wskaźnika. |
LONG_PTR |
Znakowy typ long dla precyzji wskaźnika. |
SIZE_T |
Maksymalna liczba bajtów, do których może odwoływać się wskaźnik. Użyj liczby, która musi obejmować pełny zakres wskaźnika. |
SSIZE_T |
Podpisany SIZE_T. |
UHALF_PTR |
Niepodpisane HALF_PTR. |
UINT_PTR |
Niepodpisany INT_PTR. |
ULONG_PTR |
Niepodpisane LONG_PTR. |
Określone typy Pointer-Precision
Następujące nowe typy wskaźników explicite określają rozmiar wskaźnika. Należy zachować ostrożność podczas używania wskaźników w 64-bitowym kodzie: w przypadku deklarowania wskaźnika przy użyciu typu 32-bitowego system operacyjny tworzy wskaźnik, obcinając wskaźnik 64-bitowy. (Wszystkie wskaźniki to 64 bity w 64-bitowym systemie Windows).
Termin | Opis |
---|---|
POINTER_32 |
Wskaźnik 32-bitowy. W 32-bitowym systemie Windows jest to natywny wskaźnik. W 64-bitowym systemie Windows jest to skrócony wskaźnik 64-bitowy. |
POINTER_64 |
Wskaźnik 64-bitowy. W 64-bitowym systemie Windows jest to natywny wskaźnik. W 32-bitowym systemie Windows jest to znakowo rozszerzony wskaźnik 32-bitowy. Należy pamiętać, że nie można bezpiecznie zakładać stanu najbardziej znaczącego bitu wskaźnika. |