2009-07-23 8 views
6

Jaki jest kompatybilny typ danych "int" w C++, który może zmienić rozmiar na 4 bajty na 32-bitowe, & 8 bajtów w oknach 64-bitowych?Co to jest Kompatybilny typ "int" w oknach 32Bit i 64Bit w C++?

Mimo, że INT_PTR działa dobrze, ale zmniejsza czytelność, jak również jego opis mówi nam, aby użyć go do arytmetyki wskaźnika.

Dzięki

+0

Myślałem problemu jest odwrotnie - że trzeba typ danych, który nie zmienić. Przy zmianie rozmiaru typów danych występuje problem polegający na tym, że kod może działać w jednym systemie, a nie na drugim. –

+0

* int * jest zwykle najszybszym integralnym typem platformy. Jeśli potrzebujesz tego, by na przykład liczyć w pętli, użyj po prostu * int * i niech kompilator zrobi dla ciebie brudne sztuczki. –

Odpowiedz

3

Jeśli szukasz czegoś standardzie, masz pecha. Standard nie określa rozmiaru żadnego z wbudowanych typów danych.

Pamiętaj, że INT_PTR nie oznacza arytmetycznej wskaźnika. Oznacza to, że typ będzie miał taki sam rozmiar, jak void *, co jest dokładnie tym, czego potrzebujesz. Nie będzie działać na wszystkich platformach (jestem prawie pewien, że jest to specyficzne dla systemu Windows).

1

To naprawdę zależy od kompilatora. Myślę, że jedynym (bardziej lub mniej) niezawodnym sposobem jest użycie typu wskaźnika takiego jak (void *).

Myślę, że najlepszym sposobem jest użycie jakiegoś warunkowego przetwarzania w pliku nagłówka i ustawić typ niestandardowy:

#ifdef _WIN64 
    typedef __int64 NATIVEINT; 
#else 
    typedef __int32 NATIVEINT; 
#endif 

(ta próbka dla Visual C++)

3

Norma nie wspomina o szczególnych wymaganiach dotyczących wymiarów, a jedynie o tym, że każdy typ integralny musi zapewniać co najmniej tyle miejsca, co typ przed nim. Tak więc int musi zawierać tyle, co short i tak dalej. Lepiej określ, czego potrzebujesz.

Jeśli szukasz liczb całkowitych, które nie zmieniają rozmiaru w zależności od środowiska operacyjnego, spójrz na Boost Integer Library lub nagłówek C99/C++ 11 <cstdint>. Zawiera typy takie jak uint32_t/int32_t i uintmax_t/intmax_t.

Co najważniejsze, w oparciu o Twoje pytanie ma ono: uintptr_t/intptr_t. Są one gwarantowane, że mają odpowiedni rozmiar, aby pomieścić wskaźnik na platformie.

+0

'signed size_t'? Być może chodziło Ci o 'ssize_t' firmy gcc? :) – avakar

+0

@avakar: (Prawie trzy lata później ...) Naprawiono. :-) – GManNickG

3

pod Visual Studio są oferowane również __int3264 który robi tak samo jak INT_PTR ...

+0

Po prostu muszę dodać do tego lol. __int3264. daj spokój. –