2011-06-16 13 views
5

Estoy tomando una clase de Sistemas Informáticos como prerrequisito para mis Maestros y encontré algo que me pareció fascinante y difícil de usar en la práctica y que es la "sustracción de la ficción" y el hecho de que no es necesario una instrucción de resta.¿Se ha usado alguna vez la "sustracción fingida" en el mundo real?

Algo así como:

X - Y

se puede escribir como:

x + (~ y + 1)

Ahora, eso es todo muy bien, pero parece que eso es demasiado complicado para una simple resta, especialmente cuando puedes simplemente poner "x - y". ¿Hay situaciones en las que sería necesario hacer esto o es algo que se puede hacer pero no se puede hacer?

+1

Parece complemento matemático de 2. Por lo general, se implementa en hardware como este. –

+1

No estoy seguro, pero creo que se usa en algunas implementaciones de búsqueda binaria. Elimina 2^31 limit.you puede buscar en Google "Búsqueda binaria rota" y encontrar ese ejemplo. Era una página con 50 formas de calcular mid = (hi + low)/2 – Behrooz

+2

@Behrooz: La solución allí es hacer 'bajo + (alto-bajo)/2'. –

Respuesta

2

La implementación del complemento a dos se realiza en hardware, por lo que no es necesario implementarlo de esa manera para los tipos de datos incorporados.

Si está haciendo una biblioteca aritmética de enteros de n bits, debe emular las operaciones de suma, resta, multiplicación y división, etc. en cuyo caso tal técnica podría implementarse para agregar los números de longitud de n bits , pero usar la bandera de acarreo para hacerlo es una mejor implementación en mi opinión.

+0

Gracias por su explicación de un momento en que puede entrar en uso. – Jetti

+0

en realidad una vez implementé este método en una biblioteca aritmética de enteros con n bits de muestra, que es simple de implementar. – phoxis

+0

@phoxis - ¡interesante! ¿Podría por favor aclararme qué usos tendría esa biblioteca? – Jetti

0

No pude ver el sentido de hacer esto. Ya no es más eficiente. De hecho, si el compilador no lo optimiza, termina generando más códigos de operación.

6

Esto es a menudo como se hace a nivel de hardware (es decir, dentro de la ALU).

En el nivel del software, es generalmente inútil, ya que nunca puede ser más eficiente que la sustracción directa (a menos que tenga una combinación realmente extraña de compilador/plataforma).

+3

Sin embargo, este no sería un motivo para escribirlo en el código. Los compiladores –

+0

infieren que es una instrucción de suma pero la CPU lo hará 'x + (~ y + 1)'. Así es como se implementa en el hardware. –

+0

@ahmet: Sí, eso es básicamente lo que mi respuesta ya dice. –

2

Debería ser obvio que así es como sustracción es hecho internamente, así que no estoy seguro de lo que quiere decir con "que se utiliza en el mundo real". Esta es la razón por la cual se eligió el complemento de dos en primer lugar, porque la resta está simplemente desbordando la suma negativa.

+0

Lo que quiero decir es, ¿hay algún beneficio para mí para escribir código de esa manera en lugar de simplemente usar "-"? – Jetti

+0

@Jetti, no. Sin embargo, su pregunta * en realidad * fue '¿Se ha usado alguna vez la" sustracción fingida en el mundo real? ', A lo que la respuesta es un sí rotundo. – Blindy

1

No veo ninguna razón para hacerlo en su código C. Hacerlo en el software no es más rápido que restar usando el operador menos, y es mucho más confuso.

Sin embargo, esa es la forma en que los procesadores ejecutan la resta. Apuesto a que has visto este código como un ejemplo de lo que hace el hardware, ya que es más fácil ver cómo x + (~y + 1) se convertirá en un circuito lógico.

Así que ... No, usted no utilizar este código en el mundo real, pero esta operación se ejecuta muchas veces en su procesador.

0

Cosas como esta era más común antes de que la CPU tuviera miles de millones de transistores para jugar. Una CPU particular podría no implementar un código de operación de resta específico, por lo que un compilador (o programa de ensamblaje) que tenga como objetivo debería conocer ese truco.

Estas manipulaciones también pueden ayudarlo a comprender la implementación interna de las CPU.Por ejemplo, las operaciones de división de CPU a veces se logran tomando el recíproco del divisor y multiplicándolo por el dividendo; el recíproco es la única "división" real que se realiza.

+0

¡Así no es normalmente cómo se implementan las divisiones! –

Cuestiones relacionadas