2009-11-30 29 views

Respuesta

95

Los mínimos rangos que puede confiar son:

  • short int y int: -32.767 a 32.767
  • unsigned short int y unsigned int: 0 a 65.535
  • long int: -2,147,483,647 a 2,147,483,647
  • unsigned long int: 0 a 4.294.967.295

Esto quiere decir que no, long intno puede ser invocada para almacenar cualquier número de 10 dígitos. Sin embargo, se introdujo un tipo más grande long long int en C en C99 y C++ en C++ 11 (este tipo también es a menudo admitido como una extensión por compiladores creados para estándares anteriores que no lo incluían). El rango mínimo de este tipo, si su compilador soporta, es:

  • long long int: -9.223.372.036.854.775.807 a 9.223.372.036.854.775.807
  • unsigned long long int: 0 a 18.446.744.073.709.551.615

Así que ese tipo será lo suficientemente grande (de nuevo , si lo tiene disponible).


Una nota para aquellos que creen que he cometido un error con estos límites inferiores - No lo he hecho. Los requisitos de C para los rangos se escriben para permitir las representaciones enteras complementarias o de magnitud de signo, donde el valor representable más bajo y el valor representable más alto difieren solo en el signo. También se permite tener una representación complementaria de dos donde el valor con el bit de signo 1 y todos los bits de valor 0 es una representación de trampas en lugar de un valor legal. En otras palabras, int es no se requiere para poder representar el valor -32,768.

+0

El título originalmente decía "C/C++" también. – caf

+0

por qué long long int rango positivo == rango negativo –

+0

@mohamedabdallah: Ver el último párrafo de la respuesta: los rangos estándar de C son de esa manera para permitir las representaciones de complemento o de magnitud de signo. – caf

-1

Debe consultar las especializaciones de la plantilla numeric_limits <> para un tipo determinado. Está en el encabezado.

29

El tamaño de los tipos numéricos no está definido en el estándar C++, aunque sí lo son los tamaños mínimos. La manera de saber qué tamaño son en su plataforma es utilizar numeric limits

Por ejemplo, el valor máximo para un int se puede encontrar:

std::numeric_limits<int>::max(); 

ordenadores no funcionan en base 10, la cual significa que el valor máximo será en forma de 2 n -1 debido a cómo se representan los números en la memoria. Tomemos, por ejemplo ocho bits (1 byte)

0100 1000 

El derecho más bits (número) cuando se pone a 1 representa 2 , el siguiente bit 2 , a continuación, 2 y así sucesivamente hasta llegamos a la parte más a la izquierda, que si el número no está firmado representa 2 .

Así que el número representa 2 + 2 = 64 + 8 = 72, debido a que el cuarto bit de la derecha y el séptimo bit derecho la izquierda están ajustadas.

Si fijamos todos los valores a 1:

11111111 

el número es ahora (suponiendo unsigned)
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 2 - 1
Y como podemos ver, ese es el mayor valor posible que se puede representar con 8 bits.

En mi máquina e INT y una larga son los mismos, cada uno capaz de mantener entre -2 a 2 - 1. En mi experiencia, el tamaño más común en la moderna máquina de escritorio de 32 bits.

+0

Los tamaños mínimos para el tipo entero son obligatorios según los estándares relevantes (aunque los tamaños exactos no lo son). – caf

0

Can unsigned long int contiene un número de diez dígitos (1,000,000,000 - 9,999,999,999) en una computadora de 32 bits.

No

7

Otras personas aquí publicarán enlaces a data_sizes y precisiones, etc.
Voy a decirte cómo resolverlo tú mismo.
Escriba una aplicación pequeña que hará lo siguiente.

unsigned int ui; 
std::cout << sizeof(ui)); 

esto va (dependiendo del compilador y archicture) de impresión 2, 4 u 8, diciendo longitud de 2 bytes, 4 bytes de longitud, etc.

supongamos que es 4.

ahora desea que el valor máximo 4 bytes puede almacenar, el valor máximo para un byte es (en hexadecimal) 0xFF. El valor máximo de cuatro bytes es 0x seguido de 8 f's (un par de f para cada byte, el 0x le dice al compilador que la siguiente cadena es un número hexadecimal). Ahora cambiar el programa para asignar ese valor e imprimir el resultado

unsigned int ui = 0xFFFFFFFF; 
std::cout << ui; 

Eso es el valor máximo de un entero sin signo puede contener, se muestra en la base 10 de representación.

Ahora hazlo por mucho tiempo, pantalones cortos y cualquier otro valor INTEGER del que sientas curiosidad.

NB: Este enfoque no funcionará para números de coma flotante (es decir, doble o flotante).

Esperanza esto ayuda

+1

Si prueba esto con los inicios de sesión firmados, obtendrá números negativos. Lea sobre el "complemento de dos" (enlace proporcionado), es fácil obtener el rango completo (positivo y negativo) para estos también. http://en.wikipedia.org/wiki/Twos_Compliment –

2

Para tipo de datos sin signo no hay bit de signo y todos los bits son para datos ; mientras que para , tipo de datos con signo, MSB está indicado como bit de signo y los bits restantes son para datos.

para encontrar el rango do siguientes cosas:

Paso: 1 -> Para saber ninguna de bytes para el tipo de datos dar.

Paso: 2 -> Aplique los siguientes cálculos.

 Let n = no of bits in data type 

     For signed data type :: 
      Lower Range = -(2^(n-1)) 
      Upper Range = (2^(n-1)) - 1) 

     For unsigned data type :: 
      Lower Range = 0 
      Upper Range = (2^(n)) - 1 

Por ej.

Para unsigned int size = 4 bytes (32 bits) -> Rango [0, (2^(32)) - 1]

Para firmados int size = 4 bytes (32 bits) -> rango [- (2^(32-1)), (2^(32-1)) - 1]

5

Para conocer los límites de su sistema :

#include <iostream> 
#include <limits> 
int main(int, char **) { 
    std::cout 
    << static_cast<int>(std::numeric_limits<char>::max()) << "\n" 
    << static_cast<int>(std::numeric_limits< unsigned char >::max()) << "\n" 
    << std::numeric_limits<short>::max() << "\n" 
    << std::numeric_limits< unsigned short >::max() << "\n" 
    << std::numeric_limits<int>::max() << "\n" 
    << std::numeric_limits< unsigned int >::max() << "\n" 
    << std::numeric_limits<long>::max() << "\n" 
    << std::numeric_limits< unsigned long >::max() << "\n" 
    << std::numeric_limits< long long >::max() << "\n" 
    << std::numeric_limits< unsigned long long >::max() << "\n"; 
} 

Tenga en cuenta que long long solo es legal en C99 y en C++ 11.

3

En C++, ahora int y otros datos se almacenan utilizando el método complementario de 2. Eso significa que el rango es:

-2147483648 to 2147483647 

o -2^31 a 2^31-1

1 bit está reservado a 0 valor tan positivo es uno menos que 2^(31)

Cuestiones relacionadas