Um formato de número de computador é a representação interna de valores numéricos no hardware e software de dispositivos digitales, tais como computadores programáveis e calculadoras. Os valores numéricos são armazenados como agrupamentos de bits, tais como bytes e palavras. A codificação entre valores numéricos e padrões de bits é escolhida para a conveniência da operação do computador; a codificação usada pelo conjunto de instruções do computador geralmente requer conversão para uso externo, como para impressão e exibição. Diferentes tipos de processadores podem ter diferentes representações internas de valores numéricos, e convenções distintas são usadas para números inteiros e reais. A maioria dos cálculos é realizada com formatos de números que cabem em um registrador do processador, mas some sistemas de software permitem a representação de números arbitrariamente grandes usando múltiplas palavras de memória.

Representação de números binários

Os computadores representam dados em conjuntos de dígitos binários. A representation é composta por bits que, por sua vez, são agrupados em conjuntos maiores, como os bytes.

+ Tabela 1: Binário para octal Cadeia binária Valor octal 000 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7

+ Tabela 2: Número de valores para uma cadeia de bits. Comprimento da cadeia (b) Número de valores possíveis (N) 1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1024 ...

Um bit é um dígito binário que representa um de dois estados. O conceito de um bit pode ser entendido como um valor que é 1 ou 0, ligado ou desligado, sim ou não, verdadeiro ou falso, ou codificado por uma chave ou comutador de algum tipo.

Embora um único bit, por si só, seja capaz de representar apenas dois valores, uma cadeia de bits pode ser usada para representar valores maiores. Por exemplo, uma cadeia de três bits pode representar até oito valores distintos, conforme ilustrado na Tabela 1.

À medida que o número de bits que compõem uma cadeia aumenta, o número de combinações possíveis de 0 e 1 aumenta exponencialmente. Um único bit permite apenas duas combinações de valores, dois bits combinados podem formar quatro valores separados, três bits formam oito e assim por diante, crescendo com a fórmula . A quantidade de combinações possíveis dobra com cada dígito binário adicionado, conforme ilustrado na Tabela 2.

Agrupamentos com um número específico de bits são usados para representar coisas variadas e possuem nomes específicos.

Um byte é uma cadeia de bits que contém o número de bits necessários para representar um caractere. Na maioria dos computadores modernos, trata-se de uma cadeia de oito bits. Como a definição de um byte está relacionada ao número de bits que compõem um caractere, alguns computadores mais antigos usavam um comprimento de bit diferente para o seu byte. Em muitas arquiteturas de computadores, o byte é a menor unidade endereçável. Por exemplo, mesmo que processadores de 64 bits possam endereçar a memória a sessenta e quatro bits por vez, eles ainda podem dividir essa memória em pedaços de oito bits. Isso é chamado de memória endereçável por byte. Historicamente, muitas CPUs liam dados em algum múltiplo de oito bits. Como o tamanho de byte de oito bits é muito comum, mas a definição não é padronizada, o termo octeto é algumas vezes usado para descrever explicitamente uma sequência de oito bits.

Um nibble (às vezes nybble) é um número composto por quatro bits. Sendo um meio-byte, o nibble recebeu esse nome como um jogo de palavras. Uma pessoa pode precisar de várias mordiscadas para dar uma mordida em algo; da mesma forma, um nybble é uma parte de um byte. Como quatro bits permitem dezesseis valores, um nibble também é conhecido às vezes como um dígito hexadecimal.

Exibição de números octais e hexadecimais

A codificação octal e hexadecimal são maneiras convenientes de representar números binários, conforme usado por computadores. Engenheiros de computação frequentemente precisam escrever quantidades binárias, mas na prática escrever um número binário como 1001001101010001 é tedioso e propenso a erros. Portanto, as quantidades binárias são escritas em um formato de número de base 8 ("octal") ou, muito mais comumente, de base 16 ("hexadecimal" ou hex). No sistema decimal, existem 10 dígitos, de 0 a 9, que se combinam para formar números. No sistema octal, existem apenas 8 dígitos, de 0 a 7. Ou seja, o valor de um "10" octal é o mesmo que um "8" decimal, um "20" octal é um "16" decimal e assim por diante. No sistema hexadecimal, existem 16 dígitos, de 0 a 9 seguidos, por convenção, de A a F. Ou seja, um "10" hexadecimal é o mesmo que um "16" decimal e um "20" hexadecimal é o mesmo que um "32" decimal. Um exemplo e comparação de números em diferentes bases é descrito na tabela abaixo.

Ao digitar números, caracteres de formatação são usados para descrever o sistema numérico, por exemplo, 000_0000B ou 0b000_00000 para binário e 0F8H ou 0xf8 para números hexadecimais.

Convertendo entre bases

+ Tabela 3: Comparação de valores em diferentes bases Decimal Binário Octal Hexadecimal 0 000000 00 00 1 000001 01 01 2 000010 02 02 3 000011 03 03 4 000100 04 04 5 000101 05 05 6 000110 06 06 7 000111 07 07 8 001000 10 08 9 001001 11 09 10 001010 12 0A 11 001011 13 0B 12 001100 14 0C 13 001101 15 0D 14 001110 16 0E 15 001111 17 0F

Cada um desses sistemas numéricos é um sistema posicional, mas enquanto os pesos decimais são potências de 10, os pesos octais são potências de 8 e os pesos hexadecimais são potências de 16. Para converter de hexadecimal ou octal para decimal, multiplica-se o valor de cada dígito pelo valor de sua posição e depois soma-se os resultados. Por exemplo:

Representando frações em binário

Números em ponto fixo

A formatação em ponto fixo pode ser útil para representar frações em binário.

O número de bits necessários para a precisão e o intervalo desejados deve ser escolhido para armazenar as partes inteira e fracionária de um número. Por exemplo, usando um formato de 32 bits, 16 bits podem ser usados para a parte inteira e 16 para a fracionária.

O bit do oito é seguido pelo bit do quatro, depois pelo bit do dois e pelo bit do um. Os bits fracionários continuam o padrão estabelecido pelos bits inteiros. O próximo bit é o bit do meio, depois o bit do quarto, o bit do oitavo e assim por diante. Por exemplo: bits inteiros bits fracionários 0.500 = = 00000000 00000000.10000000 00000000 1.250 == 00000000 00000001.01000000 00000000 7.375 == 00000000 00000111.01100000 00000000 Esta forma de codificação não pode representar alguns valores em binário. Por exemplo, para a fração , que é 0.2 em decimal, as aproximações mais próximas seriam as seguintes: 13107 / 65536 = 00000000 00000000.00110011 00110011 = 0.1999969... em decimal 13108 / 65536 = 00000000 00000000.00110011 00110100 = 0.2000122... em decimal

Mesmo que mais dígitos sejam usados, uma representação exata é impossível. O número , escrito em decimal como 0.333333333..., continua indefinidamente. Se for terminado prematuramente, o valor não representará com precisão.

Números em ponto flutuante Embora tanto inteiros sinalizados quanto não sinalizados sejam usados em sistemas digitais, mesmo um inteiro de 32 bits não é suficiente para lidar com todo o intervalo de números que uma calculadora pode processar, sem contar as frações. Para aproximar o maior intervalo e precisão dos números reais, temos que abandonar os inteiros sinalizados e os números em ponto fixo e mudar para um formato de "ponto flutuante".

No sistema decimal, estamos familiarizados com números em ponto flutuante da forma de Notação científica:

ou, de forma mais compacta:

1.1030402E5

que significa "1.1030402 vezes 1 seguido de 5 zeros". Temos um certo valor numérico (1.1030402) conhecido como "significando", multiplicado por uma potência de 10 (E5, significando ou 100.000), conhecido como um "expoente". Se tivermos um expoente negativo, isso significa que o número é multiplicado por um 1 que está tantas posições à direita do ponto decimal. Por exemplo:

A vantagem deste esquema é que, ao usar o expoente, podemos obter um intervalo muito mais amplo de números, mesmo que o número de dígitos no significando, ou a "precisão numérica", seja muito menor do que o intervalo. Formatos semelhantes de ponto flutuante binário podem ser definidos para computadores. Existe uma série de esquemas desse tipo, sendo o mais popular definido pelo Instituto de Engenheiros Eletricistas e Eletrônicos (IEEE). A especificação do padrão IEEE 754-2008 define um formato de ponto flutuante de 64 bits com:

um expoente binário de 11 bits, usando o formato "excesso-1023". Excesso-1023 significa que o expoente aparece como um inteiro binário não sinalizado de 0 a 2047; subtrair 1023 fornece o valor real sinalizado um significando de 52 bits, também um número binário não sinalizado, definindo um valor fracionário com um "1" implícito condutor um bit de sinal, fornecendo o sinal do número.

Com os bits armazenados in 8 bytes de memória:

byte 0 S x10 x9 x8 x7 x6 x5 x4 byte 1 x3 x2 x1 x0 m51 m50 m49 m48 byte 2 m47 m46 m45 m44 m43 m42 m41 m40 byte 3 m39 m38 m37 m36 m35 m34 m33 m32 byte 4 m31 m30 m29 m28 m27 m26 m25 m24 byte 5 m23 m22 m21 m20 m19 m18 m17 m16 byte 6 m15 m14 m13 m12 m11 m10 m9 m8 byte 7 m7 m6 m5 m4 m3 m2 m1 m0

onde "S" denota o bit de sinal, "x" denota um bit de expoente e "m" denota um bit de significando. Uma vez que os bits foram extraídos, eles são convertidos com o cálculo:

Este esquema fornece números válidos até cerca de 15 dígitos decimais, com o seguinte intervalo de números: máximo mínimo positivo 1.797693134862231E+308 4.940656458412465E-324 negativo -4.940656458412465E-324 -1.797693134862231E+308

A especificação também define vários valores especiais que não são números definidos, conhecidos como NaNs, de "Not A Number" (Não é um Número). Eles são usados por programas para designar operações inválidas e afins.

Alguns programas também usam números de ponto flutuante de 32 bits. O esquema mais comum usa um significando de 23 bits com um bit de sinal, mais um expoente de 8 bits no formato "excesso-127", fornecendo sete dígitos decimais válidos.

byte 0 S x7 x6 x5 x4 x3 x2 x1 byte 1 x0 m22 m21 m20 m19 m18 m17 m16 byte 2 m15 m14 m13 m12 m11 m10 m9 m8 byte 3 m7 m6 m5 m4 m3 m2 m1 m0 Os bits são convertidos para um valor numérico com o cálculo:

levando ao seguinte intervalo de números: máximo mínimo positive 3.402823E+38 2.802597E-45 negativo -2.802597E-45 -3.402823E+38

Tais números em ponto flutuante são conhecidos como "reais" ou "floats" em geral, mas com uma série de variações:

Um valor float de 32 bits é às vezes chamado de "real32" ou "precisão simples" (single).

Um float de 64 bits é às vezes chamado de "real64" ou "precisão dupla" (double).

A relação entre números e padrões de bits é escolhida para conveniência na manipulação do computador; oito bytes armazenados na memória do computador podem representar um real de 64 bits, dois reais de 32 bits, quatro inteiros com ou sem sinal, ou algum outro tipo de dado que caiba em oito bytes. A única diferença é como o computador os interpreta. Se o computador armazenasse quatro inteiros não sinalizados e depois os lesse de volta da memória como um real de 64 bits, quase sempre seria um número real perfeitamente válido, embora fossem dados inúteis.

Apenas um intervalo finito de números reais pode ser representado com um determinado número de bits. Operações aritméticas podem causar transbordo positivo (overflow) ou transbordo negativo (underflow), produzindo um valor grande ou pequeno demais para ser representado.