2012-05-27 10 views
16

He leído un par de veces en diferentes fuentes (por ejemplo, Wikipedia: http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size), que en C, un largo largo no es más pequeño que un largo, que no es más pequeño que un int, que no es más pequeño que un corto."int" realmente debe ser al menos tan grande como "corto" en C?

Sin embargo, he buscado esto en los estándares C90 y C99, y no he encontrado una cláusula correspondiente. Solo he encontrado que C90 y C99 especifican los tamaños mínimos de tipo (Sección 5.2.4.2.1 en los estándares C90 y C99), pero no sus tamaños en relación entre sí. ¿Me he perdido algo en los estándares?

+4

No, pero no he visto una plataforma que haga 'short' más grande que' int' ... y es precisamente por eso que utilizo '', cada vez que tengo dudas sobre cosas así –

Respuesta

13

6.3.1.1 define la relativa conversión entera ocupa de cualquiera de los dos tipos de enteros. Este es un concepto abstracto que solo pretende definir la relación entre dos tipos; no hay ningún valor definido como el rango de ningún tipo.

6.2.5p8 dice:

Para cualquier par de tipos de enteros con el mismo de signo y diferente rango de conversión número entero (ver 6.3.1.1), el rango de valores del tipo con menor rango de conversión entera es un subrango de los valores de el otro tipo.

No dice nada acerca de sus relativos tamaños, y de hecho es teóricamente posible para una aplicación conforme (pero deliberadamente perversa) tener sizeof (short) > sizeof (int). Esto solo es posible si short tiene más bits de relleno (bits que no contribuyen al valor) que int. Esto es muy poco probable; la mayoría de las implementaciones no tienen bits de relleno, y no conozco ninguna implementación en la que las relaciones de los rangos de tipos enteros difieran de las relaciones de sus tamaños.

Referencia: N1256, el último borrador C99, o N1570, el último borrador C2011.

+0

Gracias por la información adicional :) –

10

I suponer que el artículo de Wikipedia se refiere a la gama valor de esos tipos de enteros, en lugar de su tamaño (según lo informado por sizeof).

De C99 standard draft N1256:

6.3.1.1/1

El rango de long long int será mayor que el rango de long int, que será mayor que el rango de int, que deberá ser mayor que el rango de short int, que será mayor que el rango de signed char.

6.2.5/8

Para cualquier par de tipos de enteros con el mismo de signo y diferente rango de conversión de número entero (véase 6.3.1.1), la gama de valores del tipo con menor rango de conversión entera es un subrango de los valores del otro tipo.

+0

que doesn Responde completamente la pregunta. El rango de conversión relativa en realidad no implica nada sobre el tamaño relativo. –

6

De C2011 Standard

6.3.1.1/1

- El rango de largo long int será mayor que el rango de long int, que podrá ser superior a el rango de int, que será mayor que el rango de corto int, que será mayor que el rango de con signo char.

Cuestiones relacionadas