Qual intervalo de valores os tipos inteiros podem armazenar em C ++


86

Pode unsigned long intconter um número de dez dígitos (1.000.000.000 - 9.999.999.999) em um computador de 32 bits?

Além disso, quais são os intervalos de unsigned long int, long int, unsigned int, short int, short unsigned int, e int?

Respostas:


139

Os intervalos mínimos em que você pode confiar são:

  • short inte int: -32.767 a 32.767
  • unsigned short inte 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

Isso significa que não, long int não se pode confiar em nenhum número de 10 dígitos. No entanto, um tipo maior long long intfoi introduzido em C em C99 e C ++ em C ++ 11 (esse tipo também é freqüentemente suportado como uma extensão por compiladores construídos para padrões mais antigos que não o incluíam). O intervalo mínimo para este tipo, se o seu compilador suportar, é:

  • 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

Portanto, esse tipo será grande o suficiente (novamente, se você tiver disponível).


Uma observação para aqueles que acreditam que cometi um erro com esses limites inferiores - não cometi. Os requisitos C para os intervalos são escritos para permitir o complemento de uns ou representações inteiras de magnitude de sinal, onde o menor valor representável e o maior valor representável diferem apenas em sinal. Também é permitido ter uma representação de complemento de dois, em que o valor com o bit de sinal 1 e todos os bits de valor 0 é uma representação de trap em vez de um valor legal. Em outras palavras, nãoint é necessário ser capaz de representar o valor -32.768.


O título originalmente dizia "C / C ++" também.
caf

porque longo longo intervalo positivo interno == intervalo negativo
mohamed abdallah

1
@mohamedabdallah: Veja o último parágrafo da resposta: as faixas do padrão C permitem o complemento ou representações de magnitude de sinal.
caf

Aha..Eu percebi que isso intsignifica long int.
mazend

32

O tamanho dos tipos numéricos não é definido no padrão C ++, embora os tamanhos mínimos sejam. A maneira de saber o tamanho deles em sua plataforma é usar limites numéricos

Por exemplo, o valor máximo para um int pode ser encontrado por:

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

Os computadores não funcionam na base 10, o que significa que o valor máximo será na forma de 2 n -1 devido à forma como os números de representam na memória. Tome, por exemplo, oito bits (1 byte)

  0100 1000

O bit mais à direita (número) quando definido como 1 representa 2 0 , o próximo bit 2 1 , depois 2 2 e assim por diante até chegarmos ao bit mais à esquerda que, se o número não tiver sinal, representa 2 7 .

Portanto, o número representa 2 6 + 2 3 = 64 + 8 = 72, porque o 4º bit da direita e o 7º bit da direita estão definidos.

Se definirmos todos os valores como 1:

11111111

O número agora é (assumindo não assinado )
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 2 8 - 1
E como podemos ver, esse é o maior valor possível que pode ser representado com 8 bits.

Na minha máquina e int e long são iguais, cada um capaz de conter entre -2 31 a 2 31-1 . Em minha experiência, o tamanho mais comum em uma máquina de desktop moderna de 32 bits.


Os tamanhos mínimos para o tipo inteiro são exigidos pelos padrões relevantes (embora os tamanhos exatos não sejam).
caf

13

Para descobrir os limites do seu 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";
}

Observe que isso long longsó é válido no C99 e no C ++ 11.


9

Outras pessoas aqui postarão links para data_sizes e precisions, etc.
Vou lhe dizer como descobrir você mesmo.
Escreva um pequeno aplicativo que fará o seguinte.

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

isto irá (dependendo do compilador e arquitetura) imprimir 2, 4 ou 8, dizendo 2 bytes de comprimento, 4 bytes de comprimento etc.

Vamos supor que sejam 4.

Agora você quer o valor máximo que 4 bytes podem armazenar, o valor máximo para um byte é (em hexadecimal) 0xFF. O valor máximo de quatro bytes é 0x seguido por 8 f's (um par de f's para cada byte, o 0x diz ao compilador que a seguinte string é um número hexadecimal). Agora mude seu programa para atribuir esse valor e imprimir o resultado

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

Esse é o valor máximo que um int sem sinal pode conter, mostrado na representação de base 10.

Agora faça isso por longos, shorts e qualquer outro valor INTEGER que você esteja curioso.

NB: Esta abordagem não funcionará para números de ponto flutuante (ou seja, duplo ou flutuante).

Espero que isto ajude


1
Se você tentar fazer isso com ints assinados, obterá números negativos. Leia sobre o "elogio de dois" (link fornecido), é fácil obter a gama completa (positiva e negativa) para eles também. en.wikipedia.org/wiki/Twos_Compliment
Binary Worrier

8

Em C ++, agora int e outros dados são armazenados usando o método de complemento de 2. Isso significa que o intervalo é:

-2147483648 to 2147483647

ou -2 ^ 31 a 2 ^ 31-1

1 bit é reservado para 0, portanto, o valor positivo é menor que 2 ^ (31)


4

Você pode usar as funções numeric_limits<data_type>::min()e numeric_limits<data_type>::max()presentes no limitsarquivo de cabeçalho e encontrar os limites de cada tipo de dados.

#include <iostream>
#include <limits>
using namespace std;
int main()
{
    cout<<"Limits of Data types:\n";    
    cout<<"char\t\t\t: "<<static_cast<int>(numeric_limits<char>::min())<<" to "<<static_cast<int>(numeric_limits<char>::max())<<endl;
    cout<<"unsigned char\t\t: "<<static_cast<int>(numeric_limits<unsigned char>::min())<<" to "<<static_cast<int>(numeric_limits<unsigned char>::max())<<endl;
    cout<<"short\t\t\t: "<<numeric_limits<short>::min()<<" to "<<numeric_limits<short>::max()<<endl;
    cout<<"unsigned short\t\t: "<<numeric_limits<unsigned short>::min()<<" to "<<numeric_limits<unsigned short>::max()<<endl;
    cout<<"int\t\t\t: "<<numeric_limits<int>::min()<<" to "<<numeric_limits<int>::max()<<endl;
    cout<<"unsigned int\t\t: "<<numeric_limits<unsigned int>::min()<<" to "<<numeric_limits<unsigned int>::max()<<endl;
    cout<<"long\t\t\t: "<<numeric_limits<long>::min()<<" to "<<numeric_limits<long>::max()<<endl;
    cout<<"unsigned long\t\t: "<<numeric_limits<unsigned long>::min()<<" to "<<numeric_limits<unsigned long>::max()<<endl;
    cout<<"long long\t\t: "<<numeric_limits<long long>::min()<<" to "<<numeric_limits<long long>::max()<<endl;
    cout<<"unsiged long long\t: "<<numeric_limits<unsigned long long>::min()<<" to "<<numeric_limits<unsigned long long>::max()<<endl;
    cout<<"float\t\t\t: "<<numeric_limits<float>::min()<<" to "<<numeric_limits<float>::max()<<endl;
    cout<<"double\t\t\t: "<<numeric_limits<double>::min()<<" to "<<numeric_limits<double>::max()<<endl;
    cout<<"long double\t\t: "<<numeric_limits<long double>::min()<<" to "<<numeric_limits<long double>::max()<<endl;
}

A saída será: Limites de tipos de dados:

  • char: -128 a 127
  • unsigned char: 0 a 255
  • curto: -32768 a 32767
  • curto sem sinal: 0 a 65535
  • int: -2147483648 a 2147483647
  • int não assinado: 0 a 4294967295
  • long: -2147483648 a 2147483647
  • longo sem sinal: 0 a 4294967295
  • long long: -9223372036854775808 a 9223372036854775807
  • unsigned long long: 0 a 18446744073709551615
  • float: 1.17549e-038 a 3.40282e + 038
  • duplo: 2.22507e-308 a 1.79769e + 308
  • duplo longo: 3.3621e-4932 a 1.18973e + 4932

2

Para o tipo de dados sem sinal, não há bit de sinal e todos os bits são para dados; enquanto que para tipo de dados assinados sinal MSB é indicado o bit de sinal e os bits restantes são para os dados.

Para encontrar o intervalo, faça o seguinte:

Passo: 1 -> Descubra o número de bytes para o tipo de dado dado.

Passo: 2 -> Aplicar os seguintes 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 exemplo

Para tamanho interno sem sinal = 4 bytes (32 bits) -> Intervalo [0, (2 ^ (32)) - 1]

Para tamanho interno assinado = 4 bytes (32 bits) -> Intervalo [- (2 ^ (32-1)), (2 ^ (32-1)) - 1]


1

O unsigned long int pode conter um número de dez dígitos (1.000.000.000 - 9.999.999.999) em um computador de 32 bits.

Não



0

Você deve olhar para as especializações do modelo numeric_limits <> para um determinado tipo. Está no cabeçalho.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.