2 votos

División binaria con números firmados

Estoy tomando un curso de ingeniería eléctrica como parte de mi grado en informática y estamos hablando de cómo una computadora realiza cálculos matemáticos solo usando sumas. Entiendo esto porque la multiplicación es una serie de sumas. La resta es como añadir el valor negativo. Para hacer una resta, tienes que encontrar el complemento a dos y luego realizar la suma. Empecé a perderme cuando entramos en las matemáticas binarias utilizando números firmados. Creo que entiendo cómo realizar la multiplicación usando números firmados - creo que encuentras el complemento a dos del negativo, multiplicar, sumar, encontrar el complemento a dos del resultado y agregar el bit de signo correspondientemente. La división binaria con números firmados no la entiendo bien.

Por ejemplo,

1111 / 0101

Estos son números firmados, por lo que el equivalente decimal sería -7 / 5. La respuesta sería -1R2. Si convierto eso en números binarios firmados, ¿no sería 1001 0010? Entonces, ¿para llegar ahí tendría que hacer 111 - 101 = 010. Sin embargo, 11 también podría ser -1, ¿así que retrocedería y obtendría 1111 0010? Otra pregunta, se trata de esa resta: ¿no tendría que cambiarse a una suma? Si es así, ¿no se convertiría el problema en 111 + 011 (el complemento a dos de 010)?

Cuanto más lo miro, más confundido estoy. Cualquier ayuda sería apreciada.

1 votos

Si es negativo, solo cambia el signo antes de la división y cámbialo de nuevo después.

1 votos

Primero, 1111 es -1, no -7, en el complemento a 2.

1 votos

¿Números binarios en complemento a 2? Entonces tu entrada de 1111/0101 podría interpretarse como -1/5 (decimal), no -7/5.

3voto

Paul DeRocco Puntos 121

La división de enteros con signo casi siempre se realiza tomando valores absolutos, dividiendo, y luego corrigiendo los signos del cociente y el resto, al menos así era en las CPU anteriores. Pueden haber trucos más sofisticados hoy en día. Pero el hecho de que dividir por un número positivo siempre trunca hacia cero, en lugar de hacia menos infinito, sugiere que es así como se hace. Además de verificar la división por cero, es importante probar dividir el número negativo máximo por -1, porque eso produciría uno más que el número positivo máximo.

Sin embargo, las multiplicaciones de enteros con signo nunca se hacen tomando valores absolutos, multiplicando, y luego negando si es necesario. La diferencia entre un entero con signo y un entero sin firmar es simplemente que el bit más significativo tiene un peso negativo si está firmado. Un byte sin firmar tiene pesos de bits de 128, 64, 32, 16, 8, 4, 2, y 1. Un byte firmado tiene pesos de bits de -128, 64, 32, 16, 8, 4, 2, y 1. Por lo tanto, es fácil diseñar hardware que tenga eso en cuenta, utilizando una resta en lugar de una suma al multiplicar por el bit más a la izquierda.

Otra forma de verlo es que si un byte tiene un 1 en el bit más significativo, entonces el valor firmado es igual al valor sin firmar menos 256. Esto significa que si tienes un multiplicador sin firmar, puedes hacer una multiplicación firmada bastante fácilmente. Si un número tiene su bit de signo establecido, restas el otro número de la mitad alta del resultado; si el otro número tiene su bit de signo establecido, restas el primer número de la mitad alta del resultado. Y si no necesitas la mitad alta en absoluto (si conoces que los números son lo suficientemente pequeños), entonces no hay diferencia entre la multiplicación firmada y no firmada. (Solía hacer esto mucho cuando programaba el 6801 y 6809 hace décadas).

Por cierto, las representaciones estándar de punto flotante son siempre signo-magnitud, en lugar de en complemento a dos, por lo que realizan la aritmética de una forma más parecida a como lo hacen los humanos.

0 votos

1voto

RelaXNow Puntos 1164

Una respuesta simple es hacer que ambos números sean positivos (tomar el valor absoluto), realizar la división, luego negar el resultado si el XOR de los dos bits originales es 1.

Por ejemplo, dividamos -7 por 5. Usando la codificación binaria en complemento a dos de 4 bits, eso es 1001 dividido por 0101. Tomando el valor absoluto de cada uno resulta en 0111 dividido por 0101. La división da como resultado 0001. Dado que el XOR de los dos bits originales es 1, este valor se niega. Negar significa complementar y luego incrementar en 1. El negativo de 0001 es 1111, que es la respuesta final. 1111 en decimal es -1.

0 votos

Entonces, ¿estás diciendo que simplemente hacer 111 / 101 = 1 R 10? ¿Para negar el 1 obtendría 1111 o 1001? 1111 es el complemento de dos de 0001, pero empecé con números firmados no números complemento de dos, ¿o eso no importa?

0 votos

El valor absoluto significa establecer el bit de signo en 0.

0 votos

@stark Correcto, por eso dije que la operación sería 0111 / 0101, pero aún no entiendo cómo se vería mi respuesta final.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X