Skip to content

Calculadora de complemento a dos y enteros con signo

Escribe un entero con signo y obtén de golpe signo-magnitud, complemento a uno, complemento a dos y binario desplazado, de 4 a 64 bits. O pega un patrón de bits o un byte hexadecimal y verás las cinco lecturas.

Sin rastreo Se ejecuta en el navegador Gratis
Todo se calcula localmente en tu navegador — nada de lo que escribes se sube.
Ancho de bits

De decimal a representación de máquina

Escribe un número entero con signo. Las cuatro representaciones se calculan a la vez — no hace falta que sepas de antemano cuál usa tu sistema.

Prueba con estos
Codificación Bits Hex
Signo-magnitud 1000 0101 85
Complemento a uno 1111 1010 FA
Complemento a dos 1111 1011 FB
Binario desplazado 0111 1011 7B

De patrón de bits a valor

Te has encontrado un byte en un volcado de memoria o en un registro y no sabes cómo hay que leerlo. Pégalo y verás de una sola vez qué significa bajo cada interpretación — cuál es la correcta depende del sistema que lo produjo, así que se muestran todas.

Leído como Valor
Sin signo 251
Signo-magnitud -123
Complemento a uno -4
Complemento a dos -5
Binario desplazado 123
Tabla de referencia de 8 bits

Calculada por el mismo motor que usa la herramienta de arriba, así que estos valores no pueden desincronizarse de ella.

Decimal Signo-magnitud Complemento a uno Complemento a dos Binario desplazado 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
Rangos de valores por ancho de bits
Ancho Complemento a dos / binario desplazado Signo-magnitud / complemento a uno
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
Cada codificación se comprueba en la batería de pruebas con los cinco anchos, incluido el rango completo de 4 bits, los dos patrones del cero y el valor más negativo de cada ancho. Los resultados de 64 bits se contrastan con las propias BigInt.asIntN y BigInt.asUintN de JavaScript. — Equipo de Ingeniería de Go-Tools · Sep 9, 2026

Creado y verificado por el equipo de ingeniería de Go Tools.

Respuestas rápidas

¿Cuánto es −5 en complemento a dos de 8 bits?

11111011 11111011, que es 0xFB.

¿Cuál es el rango de un byte con signo?

-128 … 127 De −128 a 127 en complemento a dos; de −127 a 127 en signo-magnitud y en complemento a uno.

¿Cómo vuelvo de un patrón en complemento a dos al número?

valor − 2^n Si el bit más alto es 0, léelo como sin signo; si es 1, resta 2^n a la lectura sin signo.

¿0xFF significa −1 o 255?

−1 o 255 −1 como byte con signo y 255 como byte sin signo. Los bits por sí solos no lo deciden.

¿Qué es el complemento a dos?

El complemento a dos responde a una pregunta de hardware, no de matemáticas: ¿cómo guardas los números negativos para que el sumador que ya construiste siga funcionando? El truco está en representar −x con el patrón de 2^n − x. La suma entonces da la vuelta módulo 2^n y cae en la respuesta correcta sin ningún caso especial para los signos, que es justo por lo que la resta no necesita un circuito aparte.

De ahí se siguen dos consecuencias, y las dos salen en errores reales. Primera, el rango es asimétrico: ocho bits cubren de −128 a 127, no de −128 a 128, porque los patrones hay que repartirlos y no hay un cero negativo que iguale las cuentas. Segunda, el signo no es una bandera que puedas quitar: el bit más alto de 11111011 es 1, pero el valor es −5 y no −123, así que leer un número negativo significa interpretar la palabra entera, no mirar un solo bit.

El signo-magnitud y el complemento a uno son los dos diseños que perdieron. Siguen mereciendo la pena porque el punto flotante IEEE 754 conservó la disposición de signo-magnitud, y porque es la comparación con ellos lo que hace que el complemento a dos parezca inevitable en vez de arbitrario.

// -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.

Qué hace esta calculadora

Cuatro codificaciones a la vez

Signo-magnitud, complemento a uno, complemento a dos y binario desplazado se calculan juntos. El binario desplazado es el que la mayoría de calculadoras deja fuera, y es justo el que las hojas de datos de los ADC siguen usando.

Búsqueda inversa desde un patrón de bits

Pega los bits o el hexadecimal que realmente tienes y verás las cinco lecturas, sin signo incluida. Este es el sentido que necesitas cuando un volcado no cuadra con el número que informa el dispositivo.

Correcta con 64 bits

Cada valor se maneja con BigInt, así que 0xFFFFFFFFFFFFFF9C resuelve a −100 y no a lo que diera un truncamiento a 32 bits.

Honesta sobre lo que no tiene representación

Con ancho 8, −128 no tiene forma en signo-magnitud ni en complemento a uno. La tabla lo dice en lugar de imprimir un patrón que no significa ese número.

El cero negativo, a la vista

Escribe 0 y se muestra el segundo patrón de bits del cero en signo-magnitud y en complemento a uno, que es el argumento más claro de por qué ganó el complemento a dos.

Tablas de referencia sin JavaScript

La tabla comparativa de 8 bits y los rangos por ancho se generan al construir la página, con el mismo motor que alimenta los campos interactivos, así que no pueden desincronizarse de él.

Cómo se compara con otras formas de comprobarlo

La conversión propia de tu lenguaje

API de ejecución

BigInt.asIntN, el int.from_bytes(..., signed=True) de Python y los tipos de ancho fijo de C dan la respuesta autorizada para el código que estás escribiendo. Úsalos en el código; usa esta página cuando tengas un valor delante y ningún intérprete abierto.

La vista de memoria del depurador

Función del IDE

Muestra el valor con el tipo que declaró el programa, que es exactamente la pieza de información que le falta a un patrón de bits. No sirve cuando los bytes llegaron por un cable sin tipo declarado, y ese es justo el caso para el que está esta página.

Conversor de bases

Este sitio

Convierte entre bases, pero solo para valores no negativos: los negativos se rechazan ahí de forma explícita, porque una base no tiene opinión sobre cómo se guarda un signo. La representación con signo es trabajo de esta página; usa el conversor de bases para las magnitudes.

La contraparte en punto flotante. Mantiene una disposición de signo-magnitud en lugar de complemento a dos y sesga el exponente en 2^(e−1)−1, así que las dos páginas responden a preguntas distintas sobre la misma palabra de memoria.

Ejemplos resueltos

−5 en un byte de 8 bits

-5, ancho 8
signo-magnitud     1000 0101
complemento a uno  1111 1010
complemento a dos  1111 1011  (0xFB)
binario desplazado 0111 1011

Las tres codificaciones coinciden en el bit de signo y discrepan en todo lo demás. Solo la fila del complemento a dos es lo que de verdad guarda un int8_t de C.

El byte 0xFB leído de cinco formas

0xFB, ancho 8
sin signo          251
signo-magnitud     -123
complemento a uno  -4
complemento a dos  -5
binario desplazado 123

−128 no tiene forma en signo-magnitud

-128, ancho 8
signo-magnitud     sin representación
complemento a uno  sin representación
complemento a dos  1000 0000  (0x80)
binario desplazado 0000 0000

El signo-magnitud y el complemento a uno gastan cada uno un patrón de bits en el cero negativo, así que van de −127 a 127 y no llegan a −128. Las herramientas que aquí imprimen un byte se equivocan.

Un valor de registro de 64 bits

0xFFFFFFFFFFFFFF9C, ancho 64
complemento a dos -100
sin signo         18446744073709551516

Todo lo que pase de 32 bits hay que hacerlo con BigInt. Los operadores |, << y >>> de JavaScript truncan a 32 bits en silencio, y por eso algunas calculadoras en línea devuelven aquí una respuesta equivocada en lugar de un error.

Cómo usar la calculadora de complementos

  1. 1

    Elige el ancho de bits

    4, 8, 16, 32 o 64. No es una preferencia de visualización: los mismos bits significan números distintos según el ancho, así que equivocarse cambia la respuesta.

  2. 2

    Escribe un decimal con signo

    Teclea un número entero, con el signo negativo incluido. Las cuatro codificaciones se actualizan mientras escribes, junto con la forma hexadecimal de cada una.

  3. 3

    O ve hacia atrás desde los bits

    Pega una cadena binaria o un valor 0x en el campo de decodificación para ver qué significa ese patrón exacto bajo cada interpretación, incluida la lectura sin signo.

  4. 4

    Lee los avisos cuando aparezcan

    La página señala los dos casos con los que todo el mundo tropieza: el valor más negativo no tiene forma en signo-magnitud ni en complemento a uno, y el cero tiene un segundo patrón de bits en esas dos codificaciones.

Fallos que producen respuestas erróneas

Olvidar el +1

Invertir los bits da el complemento a uno. Pararse ahí deja el resultado a una unidad del complemento a dos, y el fallo se escapa fácil porque lo obtenido sigue pareciendo un número negativo plausible.

✗ Incorrecto
5   = 00000101
~5  = 11111010   <- ones' complement, not -5
✓ Correcto
5        = 00000101
~5       = 11111010
~5 + 1   = 11111011   <- -5 in two's complement

Usar operadores bit a bit de 32 bits sobre un valor de 64

JavaScript trunca a 32 bits los operandos de los operadores bit a bit. La mitad alta desaparece sin error, así que el resultado es erróneo en vez de faltar.

✗ Incorrecto
0xFFFFFFFFFFFFFFFB        // 18446744073709552000  -- the literal is already rounded
~0xFFFFFFFFFFFFFFFB + 1   // 0  -- silently wrong, expected -5
✓ Correcto
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn)   // -5n

Extender con ceros un valor negativo

Ampliar rellenando con ceros conserva el número solo cuando es positivo. Para un valor negativo hay que replicar el bit de signo por todos los bits nuevos.

✗ Incorrecto
int8  0xFB  (-5)
int16 0x00FB  (251)   <- zero-extended
✓ Correcto
int8  0xFB  (-5)
int16 0xFFFB  (-5)    <- sign-extended

Darle forma en signo-magnitud al valor más negativo

−128 no tiene representación en signo-magnitud ni en complemento a uno con ocho bits, porque ambas codificaciones gastan un patrón en el cero negativo. Imprimirle 10000000 es confundir la respuesta del complemento a dos con una codificación que no puede expresar ese número.

✗ Incorrecto
-128 sign-magnitude: 10000000   <- that pattern means -0
✓ Correcto
-128 sign-magnitude: no representation at width 8
-128 two's complement: 10000000

Cuándo se necesita de verdad

Leer un registro de sensor
Un registro de temperatura devuelve 0xFF9C. Sin signo eso es 65436, que no es una temperatura. Con ancho 16, la fila del complemento a dos muestra −100, y con un factor de escala de 0,1 °C el sensor te está diciendo −10,0 °C.
Depurar un protocolo con campos sin tipo
Modbus, CAN y casi toda la telemetría binaria llevan palabras en bruto sin indicación de si son con signo. Cuando un cliente y un dispositivo discrepan sobre un valor, comprobar las dos lecturas de la misma palabra suele identificar qué lado hizo la suposición equivocada.
Prácticas de estructura de computadores
Signo-magnitud, complemento a uno, complemento a dos y binario desplazado son los cuatro clásicos de un curso introductorio. Tenerlos uno al lado del otro con el mismo ancho hace las diferencias visibles en vez de memorizadas.
Perseguir un desbordamiento de entero
Cuando un contador salta de 2147483647 a −2147483648, ver ambos como patrones de 32 bits muestra que el acarreo cayó en el bit de signo. El valor no se volvió absurdo: dio la vuelta exactamente como manda la codificación.
Escribir código de serialización
Antes de fiarte de un codificador escrito a mano, comprueba un valor negativo de cada ancho contra esta página. Un fallo de signo se escribe muy fácil y produce una salida de aspecto impecable hasta que llega el primer negativo de verdad.

Cómo se construyen las cuatro codificaciones

Signo-magnitud
El bit más alto es el signo y los n−1 bits restantes son la magnitud, leída como un número sin signo normal. El rango va de −(2^(n−1)−1) a 2^(n−1)−1, simétrico y con dos ceros. Es la disposición que IEEE 754 usa para el punto flotante.
Complemento a uno
Un valor negativo es el inverso bit a bit de su magnitud, equivalentemente 2^n − 1 − x. Mismo rango y mismos dos ceros que el signo-magnitud. Su suma necesita acarreo circular, que es exactamente la complicación que el complemento a dos elimina. En inglés la posición del apóstrofo no es una errata: ones' complement se refiere a una palabra entera de unos, mientras que two's complement se refiere a una sola potencia de dos.
Complemento a dos
Un valor negativo −x se guarda como 2^n − x. El rango va de −2^(n−1) a 2^(n−1)−1, deliberadamente asimétrico y con un solo cero. La suma, la resta y la multiplicación de la palabra baja son todas ajenas al signo, y esa es toda la razón por la que ganó.
Binario desplazado
Guarda valor + 2^(n−1), de modo que −2^(n−1) queda a ceros y los patrones se ordenan igual que los valores que codifican. Equivale al patrón del complemento a dos con el bit más alto invertido. Cuidado con la nomenclatura: los campos de exponente de IEEE 754 llevan un sesgo de 2^(e−1)−1, uno menos que el desplazamiento que se usa aquí.
Por qué la aritmética usa BigInt
JavaScript convierte los operandos de &, |, ~ y los desplazamientos a enteros de 32 bits antes de operar y los reconvierte después, así que un valor de 64 bits pierde su mitad alta sin que se lance ningún error. Todas las conversiones de esta página se hacen sobre enteros de precisión arbitraria, y por eso los extremos de 64 bits salen exactos.

Tratar bien los valores con signo

Fija el ancho antes que nada
Un patrón de bits no tiene valor hasta que dices cuántos bits ocupa el campo. La mayoría de discrepancias entre una hoja de datos y un depurador se reducen a que un lado supone 16 bits y el otro 32.
Trata el valor más negativo como caso especial
Negarlo desborda en cualquier ancho: en complemento a dos, −(−128) sigue siendo −128 para un byte con signo. Todo código que calcule un valor absoluto necesita un plan para esta entrada, y toda batería de pruebas debería incluirla.
Nunca deduzcas de los datos si algo lleva signo
Ninguna inspección de los bits te dirá si un campo es con signo. Sácalo de la hoja de datos, del esquema o de la definición de la estructura; adivinar funciona hasta que llega el primer valor negativo a producción.
Extiende el signo al ampliar
Copiar un 0xFB de 8 bits a un campo de 16 como 0x00FB convierte −5 en 251. Ampliar un valor con signo significa replicar el bit de signo, lo que da 0xFFFB.
Prefiere la conversión propia del lenguaje
BigInt.asIntN en JavaScript, int.from_bytes(..., signed=True) en Python y los tipos de ancho fijo de C dicen lo que quieren decir y resuelven los bordes. El ~x + 1 hecho a mano es de donde salen los fallos de ancho.

Preguntas frecuentes

¿Qué es el complemento a dos, en una frase?
Es el convenio por el que un número negativo −x se guarda con el patrón de bits de 2^n − x, lo que hace que la suma y la resta compartan el mismo circuito y deja exactamente un cero en la recta numérica.
¿Cómo calculo un complemento a dos a mano?
Escribe la magnitud en binario, invierte todos los bits y suma 1. Para el 5 en ocho bits: 000001011111101011111011. La inversión por sí sola da el complemento a uno, y por eso los dos siempre se diferencian en una unidad.
¿Por qué −128 cabe en un byte con signo y +128 no?
El complemento a dos es deliberadamente asimétrico. Con n bits cubre de −2^(n−1) a 2^(n−1)−1, porque no desperdicia un patrón en el cero negativo como hacen el signo-magnitud y el complemento a uno. Ese hueco de más cae en el lado negativo.
¿11111011 vale −5 o 251?
Las dos cosas, y los bits por sí solos no lo aclaran. La respuesta depende del tipo que declarara el sistema que los produjo. Por eso la búsqueda inversa de esta página muestra todas las lecturas a la vez en lugar de elegir una por ti: quédate con la fila que corresponde a tu int8_t o a tu uint8_t.
¿Qué es el binario desplazado y dónde me lo voy a encontrar?
El binario desplazado (también llamado exceso-K o sesgado) guarda valor + 2^(n−1), de modo que el valor más pequeño queda a ceros y ordenar los patrones en bruto como enteros sin signo ordena también los valores con signo. Aparece en las salidas de convertidores ADC y DAC y en formatos de muestras de audio. Ojo: los exponentes de IEEE 754 usan otro sesgo —2^(e−1)−1, no 2^(e−1)—, así que no traslades el número de un caso al otro.
¿Por qué un registro Modbus marca 65436 cuando el sensor dice −100?
Modbus transporta palabras de 16 bits sin información de tipo, así que un cliente que supone sin signo imprime 65436 mientras el dispositivo quería decir el valor −100 en complemento a dos. Pega aquí 65436 como hexadecimal 0xFF9C con ancho 16 y la fila del complemento a dos muestra la lectura pretendida.
¿Se siguen usando el signo-magnitud y el complemento a uno?
Rara vez para enteros: prácticamente todas las CPU actuales usan complemento a dos, y C23 acabó por hacerlo obligatorio. Siguen siendo relevantes porque el punto flotante IEEE 754 mantiene una disposición de signo-magnitud y porque ambos aparecen todavía en los exámenes de estructura de computadores.
¿Por qué algunas calculadoras dan mal los valores de 64 bits?
Los operadores bit a bit de JavaScript convierten primero sus operandos a enteros de 32 bits, así que una página que usa ~x + 1 pierde en silencio la mitad alta de un valor de 64 bits e informa de un resultado plausible pero falso. Esta herramienta usa BigInt de principio a fin, y por eso las filas de 64 bits coinciden con lo que muestra tu depurador.
¿Qué es el cero negativo y por qué importa?
En signo-magnitud, 00000000 y 10000000 significan cero los dos; en complemento a uno son 00000000 y 11111111. Dos comparaciones que deberían salir iguales pueden por tanto diferir bit a bit. El complemento a dos tiene un único cero, lo que eliminó toda una clase de casos especiales en el hardware.
¿Se envía a algún servidor lo que escribo?
No. La página envía el motor de conversión a tu navegador y lo ejecuta ahí. Los volcados de registros y los valores de firmware suelen venir de sistemas que no eres libre de compartir, así que aquí no hay nada que creerse: basta con la pestaña de red, porque no se hace ninguna petición.

Herramientas relacionadas

Ver todas las herramientas →