2012-09-05 16 views
14

¿Cómo es short int (o short) e int diferente en C? Ellos tienen el mismo tamaño y rango. Si son esencialmente iguales, ¿de qué sirve tener dos tipos de datos?¿Cuál es la diferencia entre "short int" e "int" en C?

+0

En compiladores de 16 bits, tienen el mismo tamaño y rango. Prácticamente todos los compiladores modernos para plataformas convencionales tienen 'sizeof (int)> sizeof (short)'. –

Respuesta

22

Se puede tienen el mismo tamaño, pero se garantiza que int es igual o más grande que short int.

+3

Lo que está realmente garantizado es que los * rangos * de 'short int' son al menos -32767 .. +32767, y el rango de' short int' es un subconjunto del rango de 'int'. De esto se desprende que 'short int' y' int' son ambos al menos 16 bits. Debido a los bits de relleno, teóricamente es posible tener 'sizeof (short int)> sizeof (int)', pero es muy poco probable. –

+1

@KeithThompson, ¿puedes elaborar con respecto a 'sizeof (short int)> sizeof (int)'? – SomeWittyUsername

+1

@icepack: los tipos enteros pueden tener bits de relleno, bits que no contribuyen al valor. Por ejemplo, una implementación conforme podría * en teoría * tener 'short' con 32 bits (16 de ellos con relleno de bits) y' int' con 24 bits (todos significativos). No puedo pensar en ninguna razón para hacer una tontería, pero el estándar no lo prohíbe. –

0

"A corto número entero en un lenguaje de programación puede ser de un tamaño diferente en un idioma diferente o en un procesador diferente. En algunos idiomas este tamaño se fija a través de plataformas, mientras que en otros es dependiente de la máquina . En algunos idiomas, este tipo de datos no existe en all ".

Source

+0

Pero la pregunta es sobre C. –

+0

Yup y el enlace fuente publicado muestra la diferencia para C, C++, C# y Java. – Ljdawson

+0

La parte que citó no responde la pregunta. (Por cierto, ese párrafo fue eliminado más tarde del artículo.) –

1

Depende del sistema. Algunos sistemas operativos no tendrán la misma longitud para ambos tipos.

3

Nunca confíe en que un tipo de datos tenga un tamaño dado en C. Siempre verifique los límites en límites.h si tiene dudas.

+0

Excepto, por supuesto, si está usando 'uint32_t' y amigos de' '. – unwind

+1

Eso es parte del estándar C99 que nos lleva de vuelta a la pregunta planteada por otros sobre qué OS/compilador se está utilizando. –

0

En realidad, todo depende tanto del compilador como del sistema. Pero la regla básica dice que int nunca puede ser menos que corto y nunca puede ser más que largo.

corto < = int < = largo

+1

char <= short? – cdarke

+1

char <= short <= int <= long <= long long. Tenga en cuenta que long long no es compatible con [ISO C90] (https://en.wikipedia.org/wiki/ANSI_C) – Ultimater

14

En teoría/por el estándar C, podrían ser de cualquier tamaño, siempre y cuando short <= int.

En el mundo real, así es como se implementan los tamaños.

CPU    short int 
8 bit   16  16 
16 bit   16  16 
32 bit   16  32 
64 bit   16  32 
+0

¿Lo ha revisado en ansi c en Linux en 64 bits y visual studio en la ventana en 64 bits? Quiero saber .. –

+2

@BharatSharma 64 bit solo hace una diferencia en los tamaños de 'long' y' long long'.Aparentemente, algunos sistemas de 64 bits definen hasta 64 bits, mientras que otros sistemas implementan el estándar C99/C11 y usan 'long long' para 64 bits, dejando' long' como 32 bits. – Lundin

+0

gracias en realidad una vez que encontré el problema relacionado con el tiempo, así que estaba pensando que también es posible abreviar ... :) –

1

C99 N1256 standard draft

Todo lo que ahora estamos seguros de que es que:

2 <= sizeof(short) <= sizeof(int) 

5.2.4.2.1 Los tamaños de los tipos enteros <limits.h> da los tamaños mínimos:

1 [...] Thei valores definido por la implementación R deberá ser igual o mayor en magnitud (valor absoluto) a las mostradas [...]

  • UCHAR_MAX 255 // 8-1 febrero
  • USHRT_MAX 65535 // 16-1 febrero
  • UINT_MAX 65535 // febrero 16 a 1
  • ULONG_MAX 4294967295 // 2^32 - 1
  • ULLONG_MAX 18446744073709551615 // 2 64 - 1

6.2.5 Tipos luego dice:

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 rango de conversión más pequeño número entero es un subrango de los valores del otro tipo.

y 6.3.1.1 booleanos, caracteres y números enteros determina la conversión relativa posiciónes:

1 Cada tipo entero tiene un rango de conversión de número entero define como sigue:

  • El rango de int largo largo debe ser mayor que el rango de int largo, que debe ser mayor que el rango de int, que debe ser mayor que el rango de corto int, whi ch será mayor que el rango de char firmado.
  • El rango de cualquier tipo de entero sin signo será igual al rango del tipo de entero con signo correspondiente, si lo hay.
  • Para todos los tipos de enteros T1, T2, y T3, si T1 tiene rango mayor que T2 y T2 tiene rango mayor que T3, entonces T1 tiene rango mayor que T3
0

estaba trabajando en el lo mismo hoy Mi conclusión es que depende de la longitud de la palabra de la arquitectura de la máquina en la que se ejecuta su programa. según C99 limits.h documentación.

/* Minimum and maximum values a `signed short int' can hold. */ 
# define SHRT_MIN (-32768) 
# define SHRT_MAX 32767 

/* Maximum value an `unsigned short int' can hold. (Minimum is 0.) */ 
# define USHRT_MAX 65535 

/* Minimum and maximum values a `signed int' can hold. */ 
# define INT_MIN (-INT_MAX - 1) 
# define INT_MAX 2147483647 

/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */ 
# define UINT_MAX 4294967295U 

/* Minimum and maximum values a `signed long int' can hold. */ 
# if __WORDSIZE == 64 
# define LONG_MAX 9223372036854775807L 
# else 
# define LONG_MAX 2147483647L 
# endif 
# define LONG_MIN (-LONG_MAX - 1L) 

/* Maximum value an `unsigned long int' can hold. (Minimum is 0.) */ 
# if __WORDSIZE == 64 
# define ULONG_MAX 18446744073709551615UL 
# else 
# define ULONG_MAX 4294967295UL 
# endif 

Avísame si alguien tiene una respuesta mejor.

+0

solo para agregar intente esto –

+0

short int i = 2147483647; \t printf ("% d% d% d \ n", i, i + 1, i + 10); –

+0

int i = 2147483647; \t printf ("% d% d% d \ n", i, i + 1, i + 10); –

Cuestiones relacionadas