sistema signo representacion números numeros negativos negativo magnitud con calculadora binarios binario binary twos-complement

binary - signo - Detección de Binario Negativo



representacion de numeros binarios (4)

Pregunta 1:

"¿Es una convención de números binarios negativos que el bit más significativo indique el signo?"

Hay varias formas de representar números negativos en binario. La más común es la representación complementaria de dos que está aprendiendo. En ese sistema, sí, el bit de orden más alto indicará el signo del número (si 0 está agrupado con los números positivos).

En el binario estándar sin signo, los números se representan mediante secuencias de bits en notación posicional (para abreviar, solo usaré tres bits):

b 2 b 1 b 0 = 2 2 b 2 + 2 1 b 1 + 2 0 b 0 = 4b 2 + 2b 1 + b 0

111 2 = 7 10
110 2 = 6 10
101 2 = 5 10
100 2 = 4 10
011 2 = 3 10
010 2 = 2 10
001 2 = 1 10
000 2 = 0 10

Dos complemento
Hay varias formas de ver el complemento 2, creo que la respuesta es evidente en todos ellos. Una forma de obtener este sistema es tomar la mitad superior de los números sin firmar (que tienen todos los bits altos establecidos) y moverlos por debajo de cero:

011 2 = 3 10
010 2 = 2 10
001 2 = 1 10
000 2 = 0 10
111 2 = -1 10
110 2 = -2 10
101 2 = -3 10
100 2 = -4 10

Puedes ver claramente que el bit alto indica el signo. Nuevamente, 0 toma una de las 4 representaciones positivas, lo que lleva a que el rango no sea simétrico: [3, -4] (aunque a veces el valor más negativo se considera especial, lo que hace que el rango utilizable sea simétrico). De forma equivalente, podemos reinterpretar el bit de mayor orden como un número negativo:

b 2 b 1 b 0 = - (2 2 ) b 2 + 2 1 b 1 + 2 0 b 0 = -4 b 2 + 2b 1 + b 0

Claramente, dado que el bit alto tiene un mayor peso (en el sentido de valor absoluto) que todos los demás bits combinados, si se establece, el resultado es negativo. Si no está configurado, todos los pesos restantes son positivos y, por lo tanto, también lo es el resultado.

A partir de esta definición, podemos derivar la tercera interpretación: la regla comúnmente conocida de que -a = ~a + 1 (donde - significa negación aritmética, ~ significa complementación a nivel de bit e ignoramos desbordamiento):

a + ~ a = -4b 2 + 2b 1 + b 0 + -4 (~ b 2 ) + 2 (~ b 1 ) + ~ b 0
a + ~ a = -4 (b 2 + ~ b 2 ) + 2 (b 1 + ~ b 1 ) + (b 0 + ~ b 0 )
a + ~ a = -4 (1) + 2 (1) + (1)
a + ~ a = -1
a = - (~ a + 1)
-a = ~ a + 1

Aquí, vemos que la negación da la vuelta al bit alto, por lo que indica el signo del número. Tenga en cuenta que esto no es estrictamente cierto, ya que la adición con uno puede invertir el bit alto si todos los demás bits están configurados. Sin embargo, este es solo el caso para 0 y el número más negativo (-4 10 , o 100 2 , en este caso), los cuales permanecen iguales cuando son negados.

La ventaja de utilizar el complemento 2 es que el mismo hardware se puede usar para agregar firmado y sin firmar. Esta bonita propiedad no es válida para las otras representaciones binarias negativas que se han utilizado en el pasado, algunas de las cuales abordaré brevemente. Debido a este hecho, las CPU modernas casi siempre usan esta representación para la aritmética de enteros (no conozco ningún contraejemplo comercial reciente, pero pueden estar ahí fuera). Es por eso que está aprendiendo sobre esto (en lugar de Convert binary to denary -> subtract denary -> reconvert into binary ): para comprender cómo funcionan las operaciones en el nivel de puerta de una ALU.

Uno-complemento
El complemento 1 está estrechamente relacionado con el complemento 2s. La negación se realiza invirtiendo solo los bits (sin adición de 1). El bit inicial aún indica signo, pero hay representaciones diferentes para cero positivo y negativo. Nunca me he encontrado personalmente con el uso del complemento 1 en el mundo real, pero es de interés histórico.

b 2 b 1 b 0 = -3b 2 + 2b 1 + b 0

011 2 = 3 10
010 2 = 2 10
001 2 = 1 10
000 2 = 0 10
111 2 = -0 10
110 2 = -1 10
101 2 = -2 10
100 2 = -3 10

Signo-y-magnitud
Sign-and-magnitude es lo más cercano a cómo los humanos normalmente escriben números negativos. Los dos bits bajos tienen el mismo peso que en los sistemas anteriores y el bit alto no tiene peso (aditivo). En cambio, solo cambia el signo del resultado. Aquí, obviamente, el bit de inicio indica signo. Al igual que el complemento 1s, hay dos representaciones de 0. Todavía se usa hoy en la mantisa de números flotantes IEEE (aunque el exponente se encuentra entre el signo y la magnitud).

b 2 b 1 b 0 = (-1) b 2 (2b 1 + b 0 )

0 11 2 = + 3 10
0 10 2 = + 2 10
0 01 2 = + 1 10
0 00 2 = + 0 10
1 00 2 = - 0 10
1 01 2 = - 1 10
1 10 2 = - 2 10
1 11 2 = - 3 10

Exceso de n
Excess-n es realmente más como una familia de sistemas. Todos los valores se cambian por n (conocido como el sesgo ) y luego se representan como en el caso sin signo. El bit inicial puede indicar el signo si se elige el sesgo correcto, aunque con diferente polaridad que los sistemas anteriores (y 0 podría agruparse con los negativos o los positivos). Esto todavía se usa en el exponente de números de punto flotante IEEE. Para n = 3, el bit alto indica signo y 0 se agrupa con los números negativos:

b 2 b 1 b 0 = 4b 2 + 2b 1 + b 0 - n

111 2 = 4 10
110 2 = 3 10
101 2 = 2 10
100 2 = 1 10
011 2 = 0 10
010 2 = -1 10
001 2 = -2 10
000 2 = -3 10

Otros
Hay todavía otras representaciones enteras más esotéricas, como la ternaria equilibrada, la base negativa 2 o (posiblemente) la decimal codificada en binario (o BCD para abreviar). La razón por la que digo que BCD es discutible es que los procesadores modernos a menudo todavía tienen soporte (aunque no es la forma en que los números se representan internamente) y muchas calculadoras solían estar basadas en él. En estos sistemas, el bit inicial (o trit, o base-n digit) puede o no indicar el signo (o puede indicarlo en algunos casos, pero no en otros).

Pregunta 2:

"¿Cómo determina el usuario final la diferencia entre 11101100 que es 236 y -20?"

En general, no hay forma de saber si un número almacenado en un registro o memoria en realidad está destinado a ser complementario o no, como lo señalaron otros. Básicamente, debe hacer un seguimiento de lo que se ha hecho para determinarlo.

Sin embargo, si el número es un valor inmediato almacenado directamente en una instrucción de código máquina, el código de operación podría indicar si está firmado o no (según la arquitectura). Esto puede cambiar, por ejemplo, cómo se manejan los desbordamientos , o si se realiza la extensión de signo o no.

Por ejemplo, puede haber instrucciones separadas de "carga inmediata" y "carga inmediata firmada" que copian un valor de valor inmediato en un registro más grande, el segundo haciendo extensión de firma y el primero no. Las instrucciones de "bifurcación" a menudo tienen una firma inmediata para indicar el tamaño del salto (para que tanto las ramas hacia adelante como hacia atrás puedan usar una sola instrucción). Puede haber diferentes instrucciones "agregar inmediatamente" y "agregar sin firmar inmediato" que establecen indicadores de desbordamiento de manera apropiada para el tipo de adición.

Extensión de señal
La extensión de signo significa copiar el bit alto para conservar el valor de un número de complemento 2. Esto producirá resultados incorrectos para la mitad de los números sin firmar.

Extensión de signo no realizada:

100 2 = 00000100 2
Sin firmar: 4 10 = 4 10
Firmado: -4 10 = 4 10

Extensión de signo realizada:

100 2 = 11111100 2
Firmado: -4 10 = -4 10
Sin firmar: 4 10 = 252 10

001 2 = 00000001 2
Firmado y sin firmar: 1 10 = 1 10

Rebosar
Agregar o restar dos números puede dar un resultado que es demasiado grande (en un sentido absoluto) para representarse correctamente. La adición de las mismas dos secuencias binarias puede causar el desbordamiento de los números con signo pero no sin firmar (o viceversa).

Los desbordamientos firmados pero no firmados no:

011 2 + 011 2 = 110 2
Firmado: 3 10 +3 10 = -2 10
Sin firmar: 3 10 +3 10 = 6 10

Desbordamientos sin signo pero firmado no:

111 2 + 010 2 = 001 2
Sin firmar: 7 10 + 2 10 = 1 10
Firmado: -1 10 + 2 10 = 1 10

Hoy, en clase, mi profesor de Informática nos estaba explicando (o intentando explicar) cómo escribir un número binario negativo usando Complemento de Dos. Mi pregunta es esta:

¿Cómo determina el usuario final la diferencia entre 11101100 que es 236 y -20? Sé que siempre puedes verificar el bit más significativo, pero ¿siempre es 100% exacto? ¿Es una convención de números binarios negativos que el bit más significativo indique el signo?

Nota al margen :
¿Por qué aprendemos la resta binaria cuando podemos hacer lo siguiente?

Convierte binario a denary -> resta denary -> reconvierte a binario


  1. En la notación de complemento a dos, el bit más alto siempre indica el signo. Sin embargo, debe conocer el ancho del campo y también debe saber si se está utilizando la notación de complemento de dos. Por ejemplo, si 11101100 es un número de 32 bits, entonces el bit más significativo es 0, por lo que es +236. Si es un entero de 8 bits sin signo, entonces es +236 porque los números sin signo no usan la notación de complemento de dos (solo los números con signo lo hacen).

  2. Sumar y restar en binario es cómo lo hace la computadora. Entonces, es útil saber para entender cómo funciona la computadora.


¿Cómo determina el usuario final la diferencia entre 11101100 que es 236 y -20?

El usuario no puede determinarlo solo desde el patrón de bits. Algún contexto debe indicar si este byte está firmado o no. En la mayoría de los lenguajes de programación, este contexto se rastrea mediante el seguimiento de los tipos. Por lo tanto, en C o C ++ has signed char y unsigned char . (Plain old char podría ser cualquiera).

Existe una razón por la que la resta binaria funciona, es que (al igual que algunas otras operaciones) pasa a ser exactamente lo mismo que el patrón de bits, incluso si el tipo "es incorrecto". Una forma de pensar esto es que (para estas operaciones) está haciendo un módulo aritmético 256, y en ese módulo 236 y -20 son en realidad dos nombres para el mismo número.


La respuesta corta es que depende de cómo la está usando. Casi todos los compiladores modernos representan sus valores enteros como complemento de dos. Es una convención. Si está escribiendo su código en ensamblaje, debe prestar más atención a lo que está en la memoria o en un registro, pero en los idiomas de nivel superior, el tipo de datos del valor le indica. Si el tipo está firmado, el MSB es el bit de signo, de lo contrario no lo es. El tipo de datos también le dice cuántos bits hay en el valor, por lo que podrá identificar qué bit es el MSB. Por ejemplo, un int8_t es siempre de 8 bits y está firmado, mientras que un uint8_t siempre es de 8 bits pero no está firmado. Siempre que sepa cómo identificar el tipo de datos, sabrá exactamente cómo interpretar el valor en la memoria cuando vea representado en binario.