O tamanho das variáveis C ++
C ++ permite expandir em tipos de variáveis inteiros, adicionando as seguintes descritores na frente: const, não assinado, baixo, ou o mais longo. Assim, você poderia declarar algo como o seguinte:
unsigned long int ulnVariable-
UMA const variável não pode ser modificada. Todos os números são implicitamente const. Assim, 3 é do tipo const int, enquanto 3.0 é um const double, e '3' é um const char.
A não assinado variável pode assumir valores não-negativos apenas- no entanto, ele pode lidar com um número mais ou menos duas vezes tão grande como o seu irmão assinado. Assim, uma int não assinado tem um intervalo de 0 a 4 bilhões (em oposição a regular signedint'Faixa s de -2.000 a 2.000 milhões).
C ++ permite que você declarar um short int e um long int. Por exemplo, uma short int ocupa menos espaço, mas tem um alcance mais limitado do que um regular int, Considerando que um long int toma mais espaço de armazenamento e tem uma gama significativamente maior.
o int é assumido. Assim, as duas declarações seguintes são ambos aceitos e completamente equivalentes:
long int lnVar1- // declara um longo intlong lnVar2- // também um longo int INT é assumido
O C ++ 2011 Standard mesmo define um int long long e um long double. Estes são apenas como long int e duplo, respectivamente, só que mais assim - mais precisão e alcance maior.
Não são permitidas todas as combinações. Por exemplo, não assinado pode ser aplicada apenas para os tipos de contagem int e carbonizar. A tabela a seguir mostra as combinações legais e seu significado, juntamente com a forma de declarar uma constante desse tipo.
Digitar | Declarar uma constante | O que é isso |
---|---|---|
int | 1 | Um número contagem simples, positivo ou negativo. |
int não assinado | 1U | Um número de contagem não-negativo. |
short int | --- | Uma versão potencialmente menor do int. Ele usa menos memória, mas tem um mais limitedrange. |
long int | 1L | Uma versão potencialmente maior do int. Ele pode usar mais memória, mas tem um largerrange. |
int long long | 1LL | Uma versão do int que ispotentially ainda maior. |
flutuador | 1.0F | Um número real de precisão simples. |
duplo | 1.0 | Um número real de precisão dupla. |
long double | --- | Um número de ponto flutuante potencialmente maior. No PC, long double é o tamanho nativo para numbersinternal ao processador numérico. |
carbonizar | 'C' | Uma única carbonizar lojas de variáveis de caráter asingle. Não é adequado para aritmética. |
wchar_t | L'C ' | Uma grande personagem. Usado para armazenar grandes conjuntos de caracteres tais ideogramas asChinese e símbolos Kanji. Também conhecida como orUnicode UTF. |
Até que ponto os números de gama?
Pode parecer estranho, mas padrão do C ++ não diz exatamente como um grande número de cada tipo de dados pode acomodar. A norma aborda apenas o tamanho relativo de cada tipo de variável. Por exemplo, ele diz que o máximo long int é pelo menos tão grande como a máxima int.
O padrão de 2011 diz um pouco mais do que isso - por exemplo, um long int deve ser de pelo menos 32 bits - mas ainda não especifica o tamanho de cada tipo de variável.
Os autores do C ++ não estavam tentando ser misterioso. Eles queriam permitir que o compilador para implementar o código mais rápido absoluta possível para a máquina base. O padrão foi projetado para funcionar para todos os diferentes tipos de processadores, executando sistemas operacionais diferentes.
De facto, o tamanho de um padrão int tem mudado ao longo das últimas décadas. Antes de 2000, o padrão int na maioria dos PCs era 2 bytes e tinha uma gama de mais ou menos 64.000. Por volta de 2000, o tamanho de texto básico sobre os processadores Intel mudou para 32 bits. A maioria dos compiladores mudado para o padrão int de hoje - é 4 bytes e tem um alcance de mais ou menos 2 bilhões.
A tabela abaixo apresenta o tamanho e âmbito de cada tipo de variável na maioria dos outros compiladores significava para um processador Intel rodando em um sistema operacional de 32 bits.
Digitar | Tamanho [bytes] | Precisão | Alcance |
---|---|---|---|
short int | 2 | exato | -32.768 a 32.767 |
int | 4 | exato | -2,147,483,648 a 2.147.483.647 |
long int | 4 | exato | -2,147,483,648 a 2.147.483.647 |
int long long | 8 | exato | -9.223.372.036.854.775.808 to9,223,372,036,854,775,807 |
flutuador | 4 | 7 dígitos | +/ - 3,4028 * 10+/ -38 |
duplo | 8 | 16 dígitos | +/ - 1,7977 * 10+/ -308 |
long double | 12 | 19 dígitos | +/-1.1897 * 10+/ -4932 |
A tentativa de calcular um número que está fora do alcance de tipo de uma variável é conhecido como um transbordar. O padrão C ++ geralmente deixa os resultados de um estouro indefinido. Essa é outra maneira que os inventores de C ++ queria deixar a linguagem flexível, de modo que o código de máquina gerado seria o mais rápido possível.
No PC, um estouro de ponto flutuante gera uma exceção que, se não for tratada, vai fazer com que o programa deixe de funcionar. Tão ruim quanto isso soa, um integer overflow é ainda pior - C ++ gera um resultado incorreto sem reclamar.