Quanto é −5 em complemento de dois de 8 bits?
11111011 11111011, que é 0xFB.
Digite um inteiro com sinal e obtenha de uma vez sinal-magnitude, complemento de um, complemento de dois e binário deslocado, de 4 a 64 bits. Ou cole um padrão de bits ou byte hexadecimal e veja as cinco leituras.
Digite um número inteiro com sinal. As quatro representações são calculadas de uma vez — você não precisa saber de antemão qual delas o seu sistema usa.
| Codificação | Bits | Hex |
|---|---|---|
| Sinal-magnitude | 1000 0101 | 85 |
| Complemento de um | 1111 1010 | FA |
| Complemento de dois | 1111 1011 | FB |
| Binário deslocado | 0111 1011 | 7B |
Sinal-magnitude e complemento de um gastam cada um um padrão de bits com o zero negativo, então guardam um valor a menos que o complemento de dois e não alcançam o número mais negativo.
Você achou um byte em um despejo de memória ou em um registrador e não sabe como ele deve ser lido. Cole aqui e veja de uma vez o que ele significa sob cada interpretação — qual é a certa depende do sistema que o produziu, então todas são exibidas.
| Lido como | Valor |
|---|---|
| Sem sinal | 251 |
| Sinal-magnitude | -123 |
| Complemento de um | -4 |
| Complemento de dois | -5 |
| Binário deslocado | 123 |
Calculada pelo mesmo mecanismo que a ferramenta acima usa, então estes valores não têm como sair de sincronia com ela.
| Decimal | Sinal-magnitude | Complemento de um | Complemento de dois | Binário deslocado | Hex |
|---|---|---|---|---|---|
| 127 | 0111 1111 | 0111 1111 | 0111 1111 | 1111 1111 | 7F |
| 100 | 0110 0100 | 0110 0100 | 0110 0100 | 1110 0100 | 64 |
| 10 | 0000 1010 | 0000 1010 | 0000 1010 | 1000 1010 | 0A |
| 5 | 0000 0101 | 0000 0101 | 0000 0101 | 1000 0101 | 05 |
| 1 | 0000 0001 | 0000 0001 | 0000 0001 | 1000 0001 | 01 |
| 0 | 0000 0000 | 0000 0000 | 0000 0000 | 1000 0000 | 00 |
| -1 | 1000 0001 | 1111 1110 | 1111 1111 | 0111 1111 | FF |
| -5 | 1000 0101 | 1111 1010 | 1111 1011 | 0111 1011 | FB |
| -10 | 1000 1010 | 1111 0101 | 1111 0110 | 0111 0110 | F6 |
| -100 | 1110 0100 | 1001 1011 | 1001 1100 | 0001 1100 | 9C |
| -127 | 1111 1111 | 1000 0000 | 1000 0001 | 0000 0001 | 81 |
| -128 | — | — | 1000 0000 | 0000 0000 | 80 |
| Largura | Complemento de dois / binário deslocado | Sinal-magnitude / complemento de um |
|---|---|---|
| 4 | -8 … 7 | -7 … 7 |
| 8 | -128 … 127 | -127 … 127 |
| 16 | -32768 … 32767 | -32767 … 32767 |
| 32 | -2147483648 … 2147483647 | -2147483647 … 2147483647 |
| 64 | -9223372036854775808 … 9223372036854775807 | -9223372036854775807 … 9223372036854775807 |
Construída e verificada pela equipe de engenharia da Go Tools.
11111011 11111011, que é 0xFB.
-128 … 127 De −128 a 127 em complemento de dois; de −127 a 127 em sinal-magnitude e em complemento de um.
valor − 2^n Se o bit mais alto for 0, leia como sem sinal; se for 1, subtraia 2^n da leitura sem sinal.
−1 ou 255 −1 como byte com sinal, 255 como byte sem sinal. Os bits sozinhos não decidem isso.
O complemento de dois responde a uma pergunta de hardware, não de matemática: como guardar números negativos de modo que o somador já construído continue funcionando? O truque é representar −x pelo padrão de 2^n − x. A soma então dá a volta módulo 2^n e cai na resposta certa sem nenhum caso especial para sinais, e é por isso que a subtração não precisa de um circuito próprio.
Daí decorrem duas consequências, e as duas aparecem em bugs reais. Primeira, a faixa é assimétrica: oito bits cobrem de −128 a 127, não de −128 a 128, porque os padrões precisam ser repartidos e não existe um zero negativo para equilibrar as contas. Segunda, o sinal não é uma flag que dá para arrancar — o bit mais alto de 11111011 é 1, mas o valor é −5 e não −123, então ler um número negativo significa interpretar a palavra inteira, não olhar um bit só.
Sinal-magnitude e complemento de um são os dois projetos que perderam. Ainda vale conhecê-los porque o ponto flutuante IEEE 754 manteve o leiaute de sinal-magnitude, e porque é a comparação com eles que faz o complemento de dois parecer inevitável em vez de arbitrário.
// -5 as an 8-bit byte, three ways to arrive at the same pattern 0b00000101 // 5 ~0b00000101 // 11111010 ones' complement of 5 ~0b00000101 + 1 // 11111011 two's complement = -5 // In JavaScript the width matters: bitwise operators are 32-bit, // so anything wider has to go through BigInt. BigInt.asIntN(8, 0xFBn) // -5n BigInt.asUintN(8, -5n) // 251n BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn) // -5n // C23 made two's complement mandatory for signed integers. // Before that, the other two encodings were legal but unused.
Sinal-magnitude, complemento de um, complemento de dois e binário deslocado são calculados juntos. O binário deslocado é o que a maioria das calculadoras deixa de fora, e é justamente o que os datasheets de ADC continuam usando.
Cole os bits ou o hexadecimal que você realmente tem e veja as cinco leituras, a sem sinal inclusa. Esse é o sentido de que você precisa quando um despejo discorda do número que o dispositivo informa.
Cada valor é tratado com BigInt, então 0xFFFFFFFFFFFFFF9C resolve para −100 e não para o que um truncamento de 32 bits produziria.
Na largura 8, −128 não tem forma em sinal-magnitude nem em complemento de um. A tabela diz isso em vez de imprimir um padrão que não significa esse número.
Digite 0 e o segundo padrão de bits do zero em sinal-magnitude e em complemento de um aparece, que é o argumento isolado mais claro de por que o complemento de dois venceu.
A tabela comparativa de 8 bits e as faixas por largura são renderizadas na construção da página, pelo mesmo mecanismo que alimenta os campos interativos, então não têm como sair de sincronia com ele.
BigInt.asIntN, o int.from_bytes(..., signed=True) do Python e os tipos de largura fixa do C dão a resposta com autoridade para o código que você está escrevendo. Use-os no código; use esta página quando você tem um valor na frente e nenhum interpretador aberto.
Ela mostra o valor com o tipo que o programa declarou, que é exatamente a informação que falta a um padrão de bits. Não ajuda quando os bytes chegaram por um fio sem tipo declarado — e é esse o caso para o qual esta página existe.
Ele converte entre bases, mas só para valores não negativos — negativos são recusados lá de forma explícita, porque uma base não tem opinião sobre como um sinal é guardado. A representação com sinal é trabalho desta página; use o conversor de base para as magnitudes.
A contraparte em ponto flutuante. Ele mantém um leiaute de sinal-magnitude em vez de complemento de dois e polariza o expoente por 2^(e−1)−1, então as duas páginas respondem a perguntas diferentes sobre a mesma palavra de memória.
-5, largura 8
sinal-magnitude 1000 0101 complemento de um 1111 1010 complemento de dois 1111 1011 (0xFB) binário deslocado 0111 1011
As três codificações concordam no bit de sinal e discordam em todo o resto. Só a linha do complemento de dois é o que um int8_t de C guarda de fato.
0xFB, largura 8
sem sinal 251 sinal-magnitude -123 complemento de um -4 complemento de dois -5 binário deslocado 123
-128, largura 8
sinal-magnitude sem representação complemento de um sem representação complemento de dois 1000 0000 (0x80) binário deslocado 0000 0000
Sinal-magnitude e complemento de um gastam cada um um padrão de bits com o zero negativo, então vão de −127 a 127 e não alcançam −128. Ferramentas que imprimem um byte aqui estão erradas.
0xFFFFFFFFFFFFFF9C, largura 64
complemento de dois -100 sem sinal 18446744073709551516
Qualquer coisa acima de 32 bits precisa ser feita com BigInt. Os operadores |, << e >>> do JavaScript truncam para 32 bits em silêncio, e é por isso que algumas calculadoras online devolvem aqui uma resposta errada em vez de um erro.
4, 8, 16, 32 ou 64. Isso não é uma preferência de exibição: os mesmos bits significam números diferentes em larguras diferentes, então errar aqui muda a resposta.
Digite um número inteiro, com o sinal de negativo incluído. As quatro codificações se atualizam conforme você digita, junto com a forma hexadecimal de cada uma.
Cole uma cadeia binária ou um valor 0x no campo de decodificação para ver o que aquele padrão exato significa sob cada interpretação, incluindo a leitura sem sinal.
A página sinaliza os dois casos em que todo mundo tropeça: o valor mais negativo não tem forma em sinal-magnitude nem em complemento de um, e o zero tem um segundo padrão de bits nessas duas codificações.
Inverter os bits dá o complemento de um. Parar aí deixa o resultado a uma unidade do complemento de dois, e o erro passa fácil porque o que sai continua parecendo um número negativo plausível.
5 = 00000101 ~5 = 11111010 <- ones' complement, not -5
5 = 00000101 ~5 = 11111010 ~5 + 1 = 11111011 <- -5 in two's complement
O JavaScript trunca para 32 bits os operandos dos operadores bit a bit. A metade alta some sem erro nenhum, então o resultado é errado em vez de ausente.
0xFFFFFFFFFFFFFFFB // 18446744073709552000 -- the literal is already rounded ~0xFFFFFFFFFFFFFFFB + 1 // 0 -- silently wrong, expected -5
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn) // -5n
Alargar preenchendo com zeros preserva o número apenas quando ele é positivo. Para um valor negativo, o bit de sinal precisa ser replicado por todos os bits novos.
int8 0xFB (-5) int16 0x00FB (251) <- zero-extended
int8 0xFB (-5) int16 0xFFFB (-5) <- sign-extended
−128 não tem representação em sinal-magnitude nem em complemento de um com oito bits, porque as duas codificações gastam um padrão com o zero negativo. Imprimir 10000000 para ele confunde a resposta do complemento de dois com uma codificação incapaz de expressar esse número.
-128 sign-magnitude: 10000000 <- that pattern means -0
-128 sign-magnitude: no representation at width 8 -128 two's complement: 10000000
0xFF9C. Sem sinal isso é 65436, que não é uma temperatura. Na largura 16 a linha do complemento de dois mostra −100, e com um fator de escala de 0,1 °C o sensor está dizendo −10,0 °C.n−1 bits restantes são a magnitude, lida como um número sem sinal comum. A faixa vai de −(2^(n−1)−1) a 2^(n−1)−1, simétrica, com dois zeros. É o leiaute que o IEEE 754 usa para ponto flutuante.2^n − 1 − x. Mesma faixa e mesmos dois zeros do sinal-magnitude. A soma exige vai-um circular, que é exatamente a complicação que o complemento de dois elimina. Em inglês a posição do apóstrofo não é erro de digitação: ones' complement se refere a uma palavra toda de uns, enquanto two's complement se refere a uma única potência de dois.−x é guardado como 2^n − x. A faixa vai de −2^(n−1) a 2^(n−1)−1, deliberadamente assimétrica, com um zero só. Soma, subtração e a multiplicação da palavra baixa são todas indiferentes ao sinal, e essa é toda a razão de ele ter vencido.valor + 2^(n−1), de modo que −2^(n−1) vira tudo zero e os padrões ordenam na mesma ordem dos valores que codificam. Equivale ao padrão do complemento de dois com o bit mais alto invertido. Cuidado com a nomenclatura: os campos de expoente do IEEE 754 são polarizados por 2^(e−1)−1, um a menos que o deslocamento usado aqui.&, |, ~ e dos deslocamentos para inteiros de 32 bits antes de operar e converte de volta depois, então um valor de 64 bits perde a metade alta sem que nenhum erro seja levantado. Toda conversão desta página é feita sobre inteiros de precisão arbitrária, e é também por isso que os extremos de 64 bits saem exatos.−(−128) continua sendo −128 para um byte com sinal. Todo código que calcula valor absoluto precisa de um plano para essa entrada, e toda bateria de testes deveria contê-la.0xFB de 8 bits para um campo de 16 como 0x00FB transforma −5 em 251. Alargar um valor com sinal significa replicar o bit de sinal, o que dá 0xFFFB.BigInt.asIntN em JavaScript, int.from_bytes(..., signed=True) em Python e os tipos de largura fixa em C dizem o que querem dizer e resolvem as bordas. O ~x + 1 feito à mão é de onde vêm os bugs de largura.2^n − x, o que faz soma e subtração usarem o mesmo circuito e deixa exatamente um zero na reta numérica. 00000101 → 11111010 → 11111011. Só a inversão já dá o complemento de um, e é por isso que os dois estão sempre a uma unidade de distância. n bits ele cobre de −2^(n−1) a 2^(n−1)−1, porque não desperdiça um padrão com o zero negativo como fazem o sinal-magnitude e o complemento de um. Essa vaga extra cai no lado negativo. int8_t ou ao seu uint8_t. valor + 2^(n−1), de modo que o menor valor fica todo em zeros e ordenar os padrões brutos como inteiros sem sinal ordena também os valores com sinal. Ele aparece em saídas de conversores ADC e DAC e em formatos de amostras de áudio. Atenção: os expoentes do IEEE 754 usam outra polarização — 2^(e−1)−1, não 2^(e−1) — então não transporte o número de um caso para o outro. 65436 enquanto o dispositivo queria dizer o valor −100 em complemento de dois. Cole aqui 65436 como hexadecimal 0xFF9C na largura 16 e a linha do complemento de dois mostra a leitura pretendida. ~x + 1 perde em silêncio a metade alta de um valor de 64 bits e informa um resultado plausível, mas errado. Esta ferramenta usa BigInt do começo ao fim, e é por isso que as linhas de 64 bits daqui batem com o que o seu depurador mostra. 00000000 e 10000000 significam zero os dois; em complemento de um são 00000000 e 11111111. Duas comparações que deveriam dar iguais podem, portanto, sair diferentes bit a bit. O complemento de dois tem um único zero, o que eliminou toda uma classe de casos especiais no hardware. Ferramentas de Conversão
Converta números entre binário, hexadecimal, decimal, octal e qualquer base personalizada (2-36) instantaneamente. Gratuito, privado, sem cadastro — todo o processamento acontece no seu navegador.
Ferramentas de Conversão
Converta permissões de arquivos Linux entre octal (755, 644) e símbolos rwx. Gere comandos chmod e detecte ajustes arriscados como 777 — grátis, direto no seu navegador.
Ferramentas de Conversão
Converta HEX para RGB, HSL, OKLCH, OKLAB e CMYK no seu navegador — copie qualquer formato com um clique. Grátis, sem cadastro, suas cores nunca saem da página.
Ferramentas de Conversão
Converta cores HEX para CMYK no seu navegador. Aproximação ingênua baseada em sRGB para prévias de impressão. Grátis, sem cadastro, suas cores ficam locais.
Ferramentas de Conversão
Converta qualquer cor hex para HSL no seu navegador — hex de 3, 6 e 8 dígitos com alfa, todos suportados. Grátis, instantâneo, sem cadastro, suas cores nunca saem da página.
Ferramentas de Conversão
Converta HEX para OKLCH para tokens de design do Tailwind v4. Saída perceptualmente uniforme ao vivo com avisos de gama Display P3. Grátis, apenas no navegador.