tamaño de un tipo de datos en c

¿El tamaño de la architecture de hardware de un tipo de datos depende o depende del comstackdor?

¿Quiero saber qué factores influyen realmente en la determinación del tamaño de un tipo de datos?

El comstackdor (más adecuadamente la “implementación”) es libre de elegir los tamaños, sujeto a los límites del estándar C (por ejemplo, int debe ser de al menos 16 bits). El comstackdor puede, opcionalmente, someterse a otros estándares, como POSIX, que puede agregar más restricciones. Por ejemplo, creo que POSIX dice que todos los punteros de datos son del mismo tamaño, mientras que el estándar C está perfectamente satisfecho con sizeof(int*) != sizeof(char*) .

En la práctica, las decisiones del comstackdor-escritor están fuertemente influenciadas por la architecture, porque a menos que haya una razón sólida, de lo contrario quieren que la implementación sea eficiente e interoperable. Los fabricantes de procesadores o los proveedores de sistemas operativos a menudo publican una cosa llamada “C ABI”, que le dice (entre otras cosas) qué tan grandes son los tipos y cómo se almacenan en la memoria. Los comstackdores nunca están obligados a seguir el ABI estándar para su architecture, y las CPU a menudo tienen más de un ABI común de todos modos, pero para llamar directamente desde un código de un comstackdor a otro, ambos comstackdores deben usar el mismo ABI. Entonces, si su comstackdor de C no usa la ABI de Windows en Windows, entonces necesitaría envoltorios adicionales para llamar a los archivos DLL de Windows. Si su comstackdor soporta múltiples plataformas, entonces es muy probable que use diferentes ABI en diferentes plataformas.

A menudo, se ven abreviaturas que se usan para indicar cuál de las varias ABI está en uso. Entonces, por ejemplo, cuando un comstackdor en una plataforma de 64 bits dice que es LP64, eso significa que es long y los punteros son de 64 bits, y por omisión int es de 32 bits. Si dice ILP64, eso significa que int es de 64 bits.

Al final, es más un caso de comstackdor-escritor que elige de un menú de opciones razonables, que escoger números del air de forma arbitraria. Pero la implementación siempre es libre de hacer lo que quiera. Si desea escribir un comstackdor para x86 que emule una máquina con bytes de 9 bits y palabras de 3 bytes, entonces el estándar C lo permite. Pero en lo que respecta al sistema operativo, estás por tu cuenta.

El tamaño es determinado en última instancia por el comstackdor. por ejemplo, Java tiene un conjunto fijo de tamaños (8,16,32,64) mientras que el conjunto de tamaños que ofrece C para sus diversos tipos depende en parte del hardware con el que se ejecuta; es decir, el comstackdor hace la elección pero (excepto en casos como Java donde los tipos de datos son explícitamente independientes del hardware subyacente) está fuertemente influenciado por lo que el hardware ofrece.

El tamaño de los diferentes tipos de datos es el comstackdor , y su configuración, dependiente (diferentes comstackdores o diferentes conmutadores para el mismo comstackdor, en algunas máquinas puede tener diferentes tamaños).

Por lo general, el comstackdor coincide con el hardware en el que está instalado … así que se podría decir que los tamaños de los tipos también dependen del hardware. Hacer un comstackdor que emita punteros de 16 bits en una máquina donde son de 48 bits es contraproducente.
Pero es posible usar un comstackdor en una computadora para crear un progtwig destinado a ejecutarse en una computadora diferente con diferentes tamaños.

Depende de la architecture de hardware de destino, del sistema operativo y posiblemente del comstackdor.

El comstackdor de intel dimensiona un entero largo como sigue:

  Tamaño del arco OS
 Windows IA-32 4 bytes
 Windows Intel 64 4 bytes
 Windows IA-64 4 bytes
 Linux IA-32 4 bytes
 Linux Intel 64 8 bytes
 Linux IA-64 8 bytes
 Mac OS X IA-32 4 bytes
 Mac OS X Intel 64 8 bytes  

Aquí como enlace para mostrar los tamaños en el comstackdor microsoft visual c ++ .

El tamaño de los tipos de datos “nativos” depende del comstackdor. Si bien esto a su vez está influenciado por el hardware, no comenzaría a adivinar.

Eche un vistazo a : ese encabezado tiene typedefs independientes de la plataforma que deben satisfacer cualquier necesidad que pueda tener.

La respuesta a tu pregunta es , te lo explicaré.

Considere los tipos de almacenamiento comunes, es decir, size_t, int64_t, etc. Estos se deciden (se definen en la mayoría de los casos) en el momento de la comstackción, dependiendo de la architecture en la que se está construyendo. ¿No los tienes? No teman, el comstackdor descubrió el significado subyacente de int y cómo sin signo lo afecta.

Una vez que los encabezados C estándar calculan la longitud de palabra deseada, todo se ajusta a su sistema.

Por supuesto, a menos que esté comstackndo de forma cruzada, entonces serán decididos (o definidos) por la architecture que haya especificado.

En resumen, su comstackdor (bueno, en su mayoría preprocesador) ajustará los tipos para que se ajusten a la architecture de destino. Ya sea la que está utilizando o la que está comstackndo de forma cruzada.

Eso si entiendo tu pregunta correctamente. Esta es una de las pocas abstracciones “mágicas” que proporciona el lenguaje y parte de la razón por la cual a menudo se le llama “ensamblaje portátil”.

\\ Es exclusivamente dependiente del comstackdor.

O decir más correctamente, dependiente del estándar de lenguaje C ( http://en.wikipedia.org/wiki/C99 ).

Como en la norma, se asignan claramente los tamaños de los tipos de bult-in. Pero. Ellos no son fijos “un tamaño para todos” allí.
Cualquier comstackdor en cualquier architecture debe preservar un tamaño mínimo (por ejemplo, char es al menos de 8 bits).
Pero también puede ser de 16 o incluso 32 bits de caracteres, dependiendo del arco.
Y también hay tamaños fijos entre los diferentes tipos que se conservan.
Significa que, por ejemplo, short puede ser de 8, 16 o 32 bits, pero no puede tener más longitud que un tipo más ancho int en la misma architecture.
Sólo menor o igual longitud.

Eso es un borde dentro del comstackdor con el que los desarrolladores deben trabajar si quieren hacer un comstackdor compatible con el estándar C.