2009-05-03 17 views

Respuesta

14

Este es un resultado de la naturaleza suelta de definiciones de tamaño en las especificaciones de lenguaje C y C++. Creo que C tiene tamaños mínimos específicos, pero la única regla en C++ es la siguiente:

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) 

Por otra parte, sizeof(int) y sizeof(long) no son del mismo tamaño en todas las plataformas. Cada plataforma de 64 bits con la que he trabajado ha tenido long se ajustan al tamaño de palabra natural, por lo que 32 bits en una arquitectura de 32 bits y 64 bits en una arquitectura de 64 bits.

+3

Afaik windows de 64 bits es una excepción. Es LLP64, entonces hay long = 32 bit y longlong 64 bit. Depende de lo que piense que es más importante como implementador, manteniendo sizeof (long) = sizeof (puntero) o código de rescate que asume sizeof (long) = sizeof (int). MS eligió para el último. –

+0

Marco van de Voort hace un buen punto. Retrocediendo en el tiempo, en máquinas de 16 bits, int era típicamente del mismo tamaño que short, y long era el nuevo tamaño grande de 32 bits. Entonces, con una perspectiva suficientemente grande, no hay una regla fija sobre qué int es del mismo tamaño que, había máquinas con valores cortos de 16 bits, int de 32 bits y de 64 bits de largo, creo, aunque no eran muy popular porque se asumió la mayoría del código (sizeof int == sizeof short || sizeof int == sizeof long) && sizeof short! = sizeof long. –

3

int se supone que es el tamaño de la palabra natural de la arquitectura. En los viejos tiempos, en máquinas de 16 bits como la PC original de IBM, las entradas eran de 16 bits y las de 32 bits. En máquinas de 32 bits como la serie 68000, los ints seguían siendo "el tamaño de palabra natural", que ahora era de 32 bits, y los largos permanecían en 32 bits. Con el tiempo, los largos llegaron a ser de 64 bits, y luego comenzamos a usar arquitecturas de 64 bits como Intel Core 2, por lo que espero que int crezca a 64 bits tarde o temprano.

Un hecho interesante: En mi portátil, con un Core 2 Duo y Mac OS X 10.5, int y largo son ambos de 32 bits. En mi caja Linux, también con Core 2 Duo y Ubuntu, int es de 32 bits y long de 64 bits. Hace

años, me preguntaron en una entrevista de trabajo en el que un puntero int sería después de agregar 3 a ella. Respondí "3 veces sizeof (int) pasado donde está ahora". El entrevistador me presionó y le dije que dependería de la arquitectura, ya que (en ese momento) Windows usaba entradas de 16 bits, pero como estaba haciendo la programación de Unix estaba más acostumbrado a las entradas de 32 bits. No conseguí el trabajo; sospecho que al entrevistador no le gustó el hecho de que yo supiera más que él.

+1

No creo que int sea de 64 bits en un core2. Creo que es largo que ha crecido. Al menos, esa ha sido mi experiencia en Debian de 64 bits. – Tom

+0

Tiene razón, Tom, tanto int como long tienen 4 bytes en mi MacBookPro. –

+1

No es hardware sino el compilador que elige. El mismo hardware exacto puede tener diferentes tamaños int y long dependiendo del sistema operativo y el compilador. GCC en macosx en un Intel Core 2 duo generará 32 bit int/long de forma predeterminada. Con la opción -m64 generará 32b int y 64b long (y puntero). –

8
  • int es esencialmente el tipo de número entero más conveniente y eficiente
  • long es/era la más grande tipo entero
  • short es el tipo menor entero

Si el el tipo entero más largo también es el más eficiente, el int es lo mismo que long. Hace un tiempo (piense pre-32 bit), sizeof(int) == sizeof(short) en un número de plataformas desde 16-bit era la más amplia naturales entero.

+1

char es un tipo entero, y generalmente es más pequeño que corto. –

+0

char es un poco extraño ... por sí mismo, tiene una definición definida de implementación, por lo que es un tipo extraño de entero. Considere "char c = -1; int i = c; unsigned u = c;". Los valores de i y u son implementación definida. Estoy de acuerdo en que tanto "char sin signo" como "char firmado" son tipos enteros;) –

+0

long es aún de 32 bits en sistemas de 64 bits, por lo que no es el tipo entero más grande, así como short no es el más pequeño . :) – jalf

1

int y long no son siempre del mismo tamaño, así que no asuma que están en el código. Históricamente ha habido 8 bit y 16 bit, así como las arquitecturas más familiares de 32 bit y 64 bit. Para sistemas integrados, los tamaños de palabra más pequeños aún son comunes. Busque en la red ILP32 y LP64 demasiada información.

+0

Y LLP64, el esquema win64 usa –

3

Como Tom señaló correctamente, el único tamaño estándar en C++ es char, cuyo tamaño es 1 (*). A partir de ahí, solo una relación "no más pequeña que" se mantiene entre los tipos. La mayoría de las personas afirmará que depende de la arquitectura, pero es más una decisión del compilador/OS. El mismo hardware que ejecuta MacOSX, Windows (32/64 bits) o Linux (32/64) tendrá diferentes tamaños para los mismos tipos de datos. Diferentes compiladores en la misma arquitectura y El sistema operativo puede tener diferentes tamaños.Incluso el mismo compilador exacta en el mismo sistema operativo en el mismo hardware puede tener diferentes tamaños dependiendo de las banderas de compilación:

$ cat test.cpp 
#include <iostream> 
int main() 
{ 
    std::cout << "sizeof(int): " << sizeof(int) << std::endl; 
    std::cout << "sizeof(long): " << sizeof(long) << std::endl; 
} 
$ g++ -o test32 test.cpp; ./test32 
sizeof(int): 4 
sizeof(long): 4 
$ g++ -o test64 test.cpp -m64; ./test64 
sizeof(int): 4 
sizeof(long): 8 

Ese es el resultado de usar el compilador gcc en MacOSX Leopard. Como puede ver, el hardware y el software son los mismos y, sin embargo, los tamaños difieren en dos ejecutables nacidos del mismo código.

Si su código depende de los tamaños, entonces es mejor que no utilice los tipos predeterminados pero los tipos específicos para su compilador que hacen que el tamaño sea explícito. O usando algunas bibliotecas portátiles que ofrecen ese soporte, como un ejemplo con ACE: ACE_UINT64 será un tipo de entero sin signo de 64 bits, independientemente del compilador/os/arquitectura. La biblioteca detectará el compilador y el entorno y usará el tipo de datos apropiado en cada plataforma.

(*) He vuelto a comprobar el estándar de C++ 3.9.1: el tamaño del carácter debe ser "lo suficientemente grande como para almacenar cualquier miembro del juego de caracteres básico de la implementación". Más tarde en: 5.3.3: sizeof (char), sizeof (signed char) y sizeof (unsigned char) son 1, entonces sí, el tamaño de un char es de 1 byte.

Después de leer otras respuestas encontré una que dice que bool es el tipo entero más pequeño. Una vez más, el estándar está suelto en los requisitos y solo establece que puede representar true y false pero no su tamaño. El estándar es explícito en ese sentido: 5.3.3, nota al pie: "sizeof (bool) no es necesario que sea 1".

Tenga en cuenta que algunas implementaciones de C++ han decidido usar bools de más de 1 byte por otros motivos. En los sistemas Apple MacOSX PPC con gcc, sizeof(bool)==4.

+1

sizeof (char) siempre es 1. SIN EMBARGO, el tamaño de los retornos da como resultado el número de caracteres (no octetos). CHAR_BIT podría ser, p. 32. –

+0

Según 5.3.3: "El operador sizeof produce el número de bytes en la representación del objeto de su operando". –

+1

Sin embargo, tenga en cuenta que los 'bytes' en lo que respecta a los estándares C o C++, no necesitan ser octetos. Es por eso que hay una macro CHAR_BIT para dar la cantidad real de bits en un byte (que se garantiza que sea al menos 8) – bdonlan

Cuestiones relacionadas