2009-07-23 9 views
6

¿Cuál es el tipo de datos "int" compatible en C++ que puede redimensionarse a 4 bytes en 32bit & 8 bytes en ventanas de 64 bits?¿Qué es el tipo "int" compatible en las ventanas de 32 bits y 64 bits en C++?

Aunque INT_PTR funciona bien pero reduce la legibilidad, así como su descripción nos dice que lo usemos para la aritmética del puntero.

Gracias

+0

pensé que el problema es al revés - que necesita un tipo de datos que no cambia de tamaño. Al cambiar el tamaño de los tipos de datos, usted tiene el problema de que el código puede ejecutarse en un sistema y no en el otro. –

+0

* int * suele ser el tipo integral más rápido de la plataforma. Si necesita que esto cuente en un bucle, por ejemplo, simplemente use * int * y deje que el compilador haga los trucos sucios por usted. –

Respuesta

3

Si usted está buscando algo estándar, estás de suerte. El estándar no especifica el tamaño de ninguno de los tipos de datos incorporados.

Tenga en cuenta que INT_PTR no implica aritmética del puntero. Quiero decir que el tipo tendrá el mismo tamaño que void *, que es exactamente lo que quieres. Sin embargo, no funcionará en todas las plataformas (estoy bastante seguro de que es específico de Windows).

1

Realmente depende del compilador. Creo que la única (más o menos) manera confiable es usar un tipo de puntero como (void *).

Creo que la mejor forma de hacerlo es mediante el uso de algún tipo de procesamiento condicional en el archivo de cabecera y establecer un tipo personalizado:

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

(esta muestra es para Visual C++)

3

La norma no menciona los requisitos de tamaño específicos, solo que cada tipo integral debe proporcionar al menos tanto almacenamiento como el tipo anterior. Por lo tanto, int debe contener tanto como short, y así sucesivamente. Será mejor que especifiques para qué los necesitas.

Si está buscando enteros que no cambian el tamaño según el entorno operativo, consulte Boost Integer Library o el encabezado C99/C++ 11 <cstdint>. Esto contiene tipos como uint32_t/int32_t y uintmax_t/intmax_t.

Lo más importante, basado en su pregunta, tiene: uintptr_t/intptr_t. Se garantiza que tienen el tamaño correcto para mantener un puntero en su plataforma.

+0

'signed size_t'? Quizás quisiste decir 'ssize_t' de gcc? :) – avakar

+0

@avakar: (Casi tres años después ...) Reparado. :-) – GManNickG

3

en Visual Studio también ofrecen __int3264 el que hace lo mismo que INT_PTR ...

+0

Solo tengo que agregarle una jaja a eso. __int3264. venga. –

Cuestiones relacionadas