¿Cuánto es −5 en complemento a dos de 8 bits?
11111011 11111011, que es 0xFB.
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.
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.
| 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 |
El signo-magnitud y el complemento a uno gastan cada uno un patrón de bits en el cero negativo, así que guardan un valor menos que el complemento a dos y no llegan al número más negativo.
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 |
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 |
| 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 |
Creado y verificado por el equipo de ingeniería de Go Tools.
11111011 11111011, que es 0xFB.
-128 … 127 De −128 a 127 en complemento a dos; de −127 a 127 en signo-magnitud y en complemento a uno.
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.
−1 o 255 −1 como byte con signo y 255 como byte sin signo. Los bits por sí solos no lo deciden.
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.
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.
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.
Cada valor se maneja con BigInt, así que 0xFFFFFFFFFFFFFF9C resuelve a −100 y no a lo que diera un truncamiento a 32 bits.
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.
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.
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.
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.
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.
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.
-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.
0xFB, ancho 8
sin signo 251 signo-magnitud -123 complemento a uno -4 complemento a dos -5 binario desplazado 123
-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.
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.
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.
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.
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.
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.
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.
5 = 00000101 ~5 = 11111010 <- ones' complement, not -5
5 = 00000101 ~5 = 11111010 ~5 + 1 = 11111011 <- -5 in two's complement
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.
0xFFFFFFFFFFFFFFFB // 18446744073709552000 -- the literal is already rounded ~0xFFFFFFFFFFFFFFFB + 1 // 0 -- silently wrong, expected -5
BigInt.asIntN(64, 0xFFFFFFFFFFFFFFFBn) // -5n
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.
int8 0xFB (-5) int16 0x00FB (251) <- zero-extended
int8 0xFB (-5) int16 0xFFFB (-5) <- sign-extended
−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.
-128 sign-magnitude: 10000000 <- that pattern means -0
-128 sign-magnitude: no representation at width 8 -128 two's complement: 10000000
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.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.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.−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ó.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í.&, |, ~ 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.−(−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.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.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.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. 00000101 → 11111010 → 11111011. La inversión por sí sola da el complemento a uno, y por eso los dos siempre se diferencian en una unidad. 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. int8_t o a tu uint8_t. 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. 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. ~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. 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. Herramientas de Conversión
Convierte números entre binario, hexadecimal, decimal, octal y cualquier base personalizada (2-36) al instante. Gratis, privado, sin registro — todo el procesamiento ocurre en tu navegador.
Herramientas de Conversión
Convierte permisos de archivos Linux entre octal (755, 644) y símbolos rwx. Obtén comandos chmod y detecta ajustes de riesgo como 777 — gratis, directo en tu navegador.
Herramientas de Conversión
Convierta HEX a RGB, HSL, OKLCH, OKLAB y CMYK en su navegador — copie cualquier formato con un clic. Gratis, sin registro, sus colores nunca salen de la página.
Herramientas de Conversión
Convierta colores HEX a CMYK en su navegador. Aproximación ingenua basada en sRGB para vistas previas de imprenta. Gratis, sin registro, sus colores nunca salen de la página.
Herramientas de Conversión
Convierta cualquier color hex a HSL en su navegador — admite hex de 3 dígitos, 6 dígitos y 8 dígitos con alfa. Gratis, instantáneo, sin registro, sus colores nunca salen de la página.
Herramientas de Conversión
Convierta HEX a OKLCH para tokens de diseño de Tailwind v4. Salida perceptualmente uniforme en vivo con avisos de gama Display P3. Gratis, solo en el navegador.