2012-06-05 10 views
5

Complementos de dos está configurado para facilitar que la computadora calcule la resta de dos números. ¿Pero cómo la computadora distingue un número entero con signo entero o sin signo? Es solo 0 y 1 en su memoria.¿Cómo distingue la computadora que un entero está firmado o no?

Para exmaple, 1111 1111 en la memoria de la computadora puede representar el número 255 pero también puede representar -1.

+0

vea http://en.wikipedia.org/wiki/Signedness y http://en.wikipedia.org/wiki/Signed_number_representations – mtijn

+0

No pregunto cómo el número firmado representado en la computadora – viperchaos

+0

leyó el ¿campo de golf? se publicaron porque son relevantes para su pregunta – mtijn

Respuesta

10

Firmado y sin firmar, use los mismos datos pero diferentes instrucciones.

La computadora almacena enteros con y sin signo como los mismos datos. Es decir. 255 y -1 son los mismos bits. Sin embargo, le dices al compilador qué tipo tiene la variable. Si está firmado, el compilador usa operadores firmados para manipular las variables (por ejemplo, IDIV) y cuando no está firmado, usa otra instrucción (por ejemplo, DIV). Entonces el compilador crea un programa que le dice a la CPU cómo interpretar los datos.

+1

Vale la pena señalar que en la mayoría de las CPU las instrucciones son diferentes solo en el caso de multiplicación (MUL/IMUL para IA32) y división (DIV/IDIV) ([instrucción de referencia] (http: //www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html)). Lo ingenioso del complemento de 2 no es que sea más fácil restar, pero esa adición (ADD) no importa si los números están firmados o no. Debido a esto, la resta es de hecho más fácil, ya que para restar se puede calcular fácilmente el complemento de 2 del sustraendo y agregarlo al minuendo. –

2

No las distingue. Pero con el complemento, el cálculo es el mismo:

A continuación, d se anexará a los números decimales, y b en números binarios. Los cómputos estarán en enteros de 8 bits.

-1d + 1d = 1111 1111b + 1b = 1 0000 0000b

Pero ya que desbordaba (sí, eso es 8 0 s y un 1 en un 8 bits enteros), el resultado es igual a 0.

-2d + 1d = 1111 1110b + 1b = 1111 1111b = -1d

-1d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

-1d + -1d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = -2d

Y si se tiene en cuenta estas operaciones en signo (valores binarios será sin cambios):

255d + 1d = 1111 1111b + 1b = 1 0000 0000b (this overflows) = 0d

254d + 1d = 1111 1110b + 1b = 1111 1111b = 255d

255d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

255d + 255d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = 2d

sin signo frente firmado es, pues, sólo una representación visual de sin signo, solo se usa cuando se muestra a un humano :-)

Cuestiones relacionadas