2011-12-29 19 views
9

Es int de forma predeterminada signed long int en C++?¿Está `int` por defecto` signed long int` en C++?

¿Es dependiente de la plataforma y/o del compilador? ¿Si es así, cómo?

[EDIT]

¿Alguno de los siguientes garantía de ser duplicado?

signed short int 
signed int 
signed long int 
signed long long int 
unsigned short int 
unsigned int 
unsigned long int 
unsigned long long int 
+0

En 'linux-amd64'' int' tiene 32 bits, mientras que 'long' tiene 64. –

+0

Esto es intuitivamente obvio: ¿por qué el lenguaje quemaría una palabra clave para representar lo mismo? –

+3

No puedo estar de acuerdo con esto. No siempre está idealmente libre de ambigüedad y redundancia. – qazwsx

Respuesta

8

Todos los enteros tipos son diferentes, es decir, puede sobrecargar funciones de forma segura para todos ellos y no tendrá ningún conflicto. Sin embargo, algunas veces usan la misma cantidad de bits para su representación. Incluso si usan la misma cantidad de bits, los tipos firmados y sin firmar siempre tienen un rango diferente. Excepto por char, usar cualquier tipo entero sin signed es equivalente a usarlo con signed, es decir, signed int y int son equivalentes. char es un tipo diferente como signed char y unsigned char pero char tiene la misma representación y rango de signed char o . Puede usar std::numeric_limits<char>::is_signed para averiguar cuál usa.

En los aspectos más interesantes. Las siguientes condiciones son ciertas:

  • 7 <= std::numeric_limits<signed char>::digits
  • sizeof(char) == 1
  • sizeof(char) == sizeof(signed char)
  • sizeof(char) == sizeof(unsigned char)
  • 15 <= std::numeric_limits<short>::digits
  • sizeof(char) <= sizeof(short)
  • sizeof(short) <= sizeof(int)
  • 31 <= std::numeric_limits<long>::digits
  • sizeof(int) <= sizeof(long)
  • 63 <= std::numeric_limits<long long>::digits
  • sizeof(long) <= sizeof(long long)
  • sizeof(X) == sizeof(signed X)
  • sizeof(signed X) == sizeof(unsigned X)

(donde "X" es una de char, short, int, long, y long long).

Esto significa que el tamaño de todos tipos de enteros puede ser el mismo, siempre que este tipo tienen al menos 64 bits (y al parecer el Cray X-MP era tal bestia). En máquinas contemporáneas generalmente sizeof(int) == sizeof(long) pero hay máquinas donde sizeof(int) == sizeof(short). Si long es 32 o 64 bits depende de la arquitectura real y ambos tipos se encuentran actualmente.

+0

Desaparecieron los argumentos de la plantilla, ya que se ven como etiquetas HTML, usan el marcado literal (barras de respuesta) para evitar eso. Además, estoy bastante seguro de que sus mínimos garantizados para 'std :: numeric_limits :: digits' son demasiado altos. –

+0

'std :: numeric_limits :: digits> = 16', true. Pero su respuesta tiene tipos firmados, y 'dígitos' se especifica como **" Para tipos enteros, la cantidad de bits que no son firmas en la representación. "** –

23

llanura int está firmado, si es o no es del mismo tamaño que long int es dependiente de la plataforma.

lo que está garantizado es que

sizeof (int) <= sizeof (long) 

y int es lo suficientemente grande como para contener, al menos, todos los valores de -32767 a 32767.


Lo que la norma dice: (sección [basic.fundamental]:

Hay cinco tipos de entero con signo estándar: signed char , short int, int, long int y long long int. En esta lista, cada tipo proporciona al menos tanto almacenamiento como los que lo preceden en la lista. También puede haber tipos de entero extendido con extensión definida por la implementación. Los tipos enteros con signo estándar y extendido se denominan colectivamente tipos de entero con signo. Plain int s tienen el tamaño natural sugerido por la arquitectura del entorno de ejecución; los otros tipos de entero con signo se proporcionan para satisfacer necesidades especiales.

+7

+1, para otros lectores: hay un detalle importante en la primera oración: 'int' y' signed long int' son ** nunca ** el mismo * tipo *, pero pueden tener el mismo * tamaño *. –

6

Llano int es equivalente a signed int. Eso es estándar. Cualquier cosa pasada que no esté garantizada; int y long son tipos diferentes, incluso si su compilador particular los hace del mismo tamaño. La única garantía que tiene es que long es al menos tan grande como int.

4

Los modificadores long y short no son exactamente como signed y unsigned. Los dos últimos se pueden poner en cualquier tipo de entero, pero si los deja desactivados, entonces signed es el predeterminado para cada tipo de entero (excepto char). Entonces int y signed int son del mismo tipo.

Para long y short, si los deja desactivados, ninguno se elige, pero el tipo resultante es diferente. long int, short int y int son todos tipos diferentes, con short int < = int < = long int.

El int después de long, short, signed y unsigned es opcional: signed int y signed son del mismo tipo.

1

signed y int son las mismas que signed int de forma predeterminada.

Ninguno es del mismo tipo que signed short int o signed long int.

2

En C++ int es signed int de forma predeterminada, por lo que no hay ningún problema con eso. Sin embargo, int y long int son tipos diferentes en C++, por lo que este no es el mismo desde el punto de vista del idioma. La implementación de int y long int es específica de la plataforma/compilador; ambos son tipos integrales que pueden ser idénticos. La única limitación que impone el estándar de C++ es que sizeof(long int) >= sizeof(int).

Cuestiones relacionadas