resta numeros numero negativos negativo menos definicion complemento como calcula binarios binario binaria binary numeric unsigned sign microprocessors

binary - menos - numeros binarios negativos



Los números negativos se almacenan como complemento de 2 en la memoria, ¿cómo sabe la CPU si es negativo o positivo? (6)

A la CPU no le importa si un byte contiene -1 o 15 cuando lo mueve de un lugar a otro. No existe un "movimiento firmado" (a una ubicación del mismo tamaño; hay un movimiento firmado para destinos más grandes o más pequeños).

La CPU solo se preocupa por la representación cuando hace aritmética en el byte. La CPU sabe si debe realizar aritmética firmada o no firmada de acuerdo con el código de operación que usted (o el compilador en su nombre) eligió.

-1 puede representarse en binario de 4 bits como (complemento de 2) 1111

15 también se representa como 1111.

Entonces, ¿cómo diferencia la CPU entre 15 y -1 cuando obtiene valores de la memoria?


En el complemento de 2 para representar 15 requerimos 5 bits, el rango para el principio de 2 ''es de -16 a 15, por lo que el valor se convierte en 01111.


En el nivel del compilador, la diferenciación se basa en el tipo de datos. Si el tipo de datos es int, entonces se asignan 4 bytes a esa variable (en C). Entonces, el complemento de 15 en 2 es 00000000 00000000 00000000 00000000 00001111 mientras que -1 es 11111111 11111111 11111111 11111111 . El compilador luego convierte esto al código de operación correspondiente de la CPU. La CPU ejecuta este código de operación y en este nivel todo está en la forma de 1s y 0s.


La CPU no sabe si un número está firmado o sin firmar. Cuando el compilador crea el archivo de lenguaje de máquina, elige la operación correcta que se ejecutará para realizar una operación matemática con ese número. Si declara que su variable es del tipo firmado, por ejemplo, la operación que se ejecutará en lenguaje de máquina será una que trate esa posición de memoria como un valor firmado.

En cualquier software de cualquier tipo, siempre que interpretas los datos le das sentido. Un byte en la memoria puede ser un número firmado o sin firmar, o un carácter, o una parte de un archivo de música, o un píxel en una imagen, etc. Lo que le da sentido es cómo se usa ese byte.


La mayoría de las respuestas anteriores mencionan códigos de operación separados. Eso podría ser cierto para operaciones más complicadas como la multiplicación y la división, pero para sumas y restas simples no es así como funciona la CPU.

La CPU mantiene datos sobre el resultado de una instrucción en su registro de indicadores. En x86 (donde estoy más familiarizado) las dos banderas más importantes aquí son las banderas de "desbordamiento" y "llevar".

Básicamente, a la CPU no le importa si el número está firmado o sin firmar, los trata a ambos por igual. El indicador de acarreo se establece cuando el número supera el valor sin signo más alto que puede contener. El indicador de desbordamiento se establece cuando pasa por encima o por debajo del rango de un número sin signo. Si está trabajando con números sin firmar, verifique el indicador de acarreo e ignore el indicador de desbordamiento. Si está trabajando con números firmados, verifique la bandera de desbordamiento e ignore la bandera de acarreo.

Aquí hay unos ejemplos:

No firmado:

1111 (15) + 1111 (15) = 1110 (14)

Lo que hace ahora es verificar el indicador de acarreo, que en este caso contiene uno que da el resultado final

1 1110 (30)

Firmado:

1111 (-1) + 1111 (-1) = 1110 (-2)

En este caso, ignora el indicador de acarreo, el indicador de desbordamiento debe establecerse en cero.

No firmado:

0111 (7) + 0111 (7) = 1110 (14)

Cuando se comprueba la bandera de acarreo, debe ser cero.

Firmado:

0111 (7) + 0111 (7) = 1110 (-2)

En este caso, el indicador de desbordamiento se establecería, lo que significa que hubo un error en la adición.

Entonces, en resumen, el número solo está firmado o sin firmar según su interpretación, la CPU le brinda las herramientas necesarias para distinguirlas, pero no las distingue por sí sola.


La unidad accesible más pequeña es 1 byte. Eso es 8 bits. En la representación de 8 bits, 15 se almacena como 00001111. El compilador distingue entre el número positivo y negativo del bit de signo. MSB es un bit de signo. Si es 0 significa número positivo. Si es 1 significa un número negativo. MSB de la representación binaria de 15 es 0. Significa número positivo y 00001111 corresponde a +15. El binario de 8 bits de -1 es 11111111 ya que su MSB es 1, se toma un número negativo. El compilador primero toma el complemento de 2 y luego muestra el número con un signo negativo. Recuerde que si hay 8 bits para almacenar el número, entonces el valor máximo que puede almacenar es (2 ^ 7) -1, que toma 7 bits en su representación. Significa que MSB siempre es cero para un número positivo. Como en su pregunta, si suponemos que debemos tomar 4 bits para almacenar el número, entonces hay 3 bits disponibles para almacenar el valor, ya que el último bit es una reserva para mantener el signo. Para 3 bits, el valor máximo que se puede almacenar es (2 ^ 3) -1 = 7. Significa que 15 no puede ser almacenado en 4bits. Por lo tanto 1111 siempre se toma como -1 por el compilador.

Siga el enlace a continuación para obtener acceso al canal de YouTube que tiene preguntas tan difíciles. www.youTube. com / watch? v = ZxRHOT3pzx4