proposito programación programacion para lenguaje dev descargar c++ compiler-construction int sizeof platform

c++ - programación - ¿Por qué int es típicamente 32 bits en compiladores de 64 bits?



programacion c++ (7)

¿Malas elecciones por parte de los implementadores?

En serio, de acuerdo con el estándar, "las entradas tienen el tamaño natural sugerido por la arquitectura del entorno de ejecución", lo que significa un int 64 bits en una máquina de 64 bits. Uno podría fácilmente argumentar que cualquier otra cosa no es conforme. Pero en la práctica, los problemas son más complejos: cambiar de 32 bits int a 64 bits no permitiría que la mayoría de los programas manejen grandes conjuntos de datos o lo que sea (a diferencia del conmutador de 16 bits a 32); la mayoría de los programas probablemente están limitados por otras consideraciones. Y aumentaría el tamaño de los conjuntos de datos, y así reduciría la localidad y ralentizaría el programa.

Finalmente (y probablemente lo más importante), si int fuera de 64 bits, el short tendría que ser de 16 o 32 bits, y no tendría forma de especificar el otro (excepto con los typedefs en <stdint.h> , y la intención es que solo se usen en circunstancias muy excepcionales). Sospecho que esta fue la principal motivación.

¿Por qué int es típicamente 32 bits en compiladores de 64 bits? Cuando comencé a programar, me enseñaron que el int es típicamente del mismo ancho que la arquitectura subyacente. Y estoy de acuerdo en que esto también tiene sentido, me parece lógico que un entero de ancho no especificado sea tan ancho como la plataforma subyacente (a menos que estemos hablando de máquinas de 8 o 16 bits, donde un rango tan pequeño para int será apenas aplicable).

Más tarde aprendí que el int es típicamente de 32 bits en la mayoría de las plataformas de 64 bits. Así que me pregunto cuál es la razón de esto. Para almacenar datos preferiría un ancho explícitamente especificado del tipo de datos, así que esto deja el uso genérico para int , que no ofrece ninguna ventaja de rendimiento, al menos en mi sistema tengo el mismo rendimiento para enteros de 32 y 64 bits. Eso deja la huella de la memoria binaria, que se reduciría ligeramente, aunque no mucho ...


Como nadie lo ha señalado todavía.

se garantiza que int está entre -32767 y 32767 ( 2^16 ) Eso es requerido por la norma. Si desea admitir números de 64 bits en todas las plataformas, le sugiero que use el tipo correcto long long que admite ( -9223372036854775807 a 9223372036854775807 ).

Se permite que int sea ​​cualquier cosa siempre que proporcione el rango mínimo requerido por la norma.


Debido a que no hay ninguna ventaja para una gran cantidad de software para tener enteros de 64 bits.

Usar int de 64 bits para calcular cosas que se pueden calcular en un entero de 32 bits (y para muchos propósitos, los valores de hasta 4 mil millones (o +/- 2 billones) son suficientes), y hacerlos más grandes no ayudará en nada.

Sin embargo, el uso de un entero más grande tendrá un efecto negativo en la cantidad de enteros de "cosas" que caben en el caché del procesador. Así que hacerlos más grandes hará que los cálculos que involucran grandes números de enteros (por ejemplo, matrices) tomen más tiempo porque.

La int es que el tamaño natural de la máquina-palabra no es algo estipulado por el estándar C ++. En los días en que la mayoría de las máquinas tenían 16 o 32 bits, tenía sentido hacerlo con 16 o 32 bits, porque ese es un tamaño muy eficiente para esas máquinas. Cuando se trata de máquinas de 64 bits, eso ya no "ayuda". Así que quedarse con 32 bits int tiene más sentido.

Edición: Curiosamente, cuando Microsoft se movió a 64 bits, ni siquiera ganaron long 64 bits, porque se romperían muchas cosas que dependían de que el valor de 32 bits fuera long (o lo que es más importante, tenían un montón de las cosas que se basaban en el valor de 32 bits de su API, donde a veces el software del cliente usa int y otras, y no querían que se rompiera).


El estándar de C + + no indica la cantidad de memoria que se debe usar para el tipo int, sino que indica la cantidad de memoria que se debe usar al menos para el tipo int. En muchos entornos de programación en variables de puntero de 32 bits, "int" y "long" tienen una longitud de 32 bits.


La razón principal es la compatibilidad hacia atrás. Además, ya existe un tipo entero de 64 bits long y lo mismo ocurre con los tipos float : float y double . Cambiar los tamaños de estos tipos básicos para diferentes arquitecturas solo introducirá complejidad. Además, el entero de 32 bits responde a muchas necesidades en términos de rango.


The Open Group explica la historia, las concesiones y las decisiones en http://www.unix.org/whitepapers/64bit.html . Cubre los diversos modelos de datos, sus fortalezas y debilidades y los cambios realizados en las especificaciones de Unix para adaptarse a la computación de 64 bits.


int . han sido de 32 bits en la mayoría de las arquitecturas principales durante tanto tiempo que cambiarlos a 64 bits probablemente causará más problemas de los que resuelve.