two number math bit-manipulation computer-architecture twos-complement

math - number - ¿Por qué el rango de bytes firmados es de-128 a 127(complemento de 2) y no de-127 a 127?



complement 2 number (5)

Leí ¿Por qué el rango de bytes -128 a 127 en Java? dice

128 es 10000000. Invertido, es 01111111, y al agregar uno se vuelve a obtener 10000000

por lo que concluye -128 es 10000000

por lo que +128 no se puede representar en el complemento a 2 en 8 bits, pero eso significa que podemos representarlo en 9 bits, por lo que 128 es 010000000 y, por lo tanto, al tomar su complemento a 2 -128 es 110000000,

Entonces, ¿es la representación de -128 10000000 o 110000000? ¿Es la representación un poco dependiente?

¿Por qué no simplemente hacer el rango inferior -127 para 8 bits en lugar de escribir -128 como 10000000?


¿Por qué el rango de bytes sin firmar es de -128 a 127?

No es. Un byte sin firmar (suponiendo 8 bits) es de 0 a 255.

El rango de un byte con signo que utiliza el complemento a 2 es de -128 a 127, directamente de la definición de complemento a 2 :

01111111 = +127 01111110 = +126 01111101 = +125 ... 00000001 = +1 00000000 = 0 11111111 = -1 ... 10000010 = -126 10000001 = -127 10000000 = -128

Entonces, ¿es la representación de -128 10000000 o 110000000?

En 8 bits, es 10000000 , en una representación hipotética de 9 bits es 110000000 .

¿Por qué no simplemente hacer el rango inferior -127 para 8 bits?

Restringir artificialmente el rango a -127 no lograría mucho; no estaría permitiendo un valor perfectamente válido y, en general, haría el código más complejo (¿qué otra cosa haría con el patrón de bits 10000000 ?).


Entonces, ¿es la representación de -128 10000000 o 110000000? ¿Es la representación un poco dependiente?

En un mundo de 9 bits, sería 110000000. En un mundo de 16 bits, sería 1111111110000000. Al menos, mientras hablemos del complemento de dos.

¿Por qué no simplemente hacer el rango inferior -127 para 8 bits en lugar de escribir -128 como 10000000?

Como lo señaló larsmans, terminarías con un valor "no válido", contra el que tendrías que verificar constantemente. Se ha elegido el complemento de Two porque es muy fácil de manejar para la ALU. Al igual que los anchos de bytes se han elegido para ser potencia de dos (lo que tampoco es siempre el caso). A nivel de hardware, la adición del complemento de dos es idéntica a la no firmada, por lo que no se necesitan instrucciones especiales o hardware adicional (a diferencia del complemento de uno).

Con las cosas como están, todos los valores con el conjunto de bits más alto son negativos, todos los valores con el bit más alto sin establecer no son negativos (positivos o cero). Fácil, ¿no es así? El rango negativo, que es uno mayor que el rango positivo, es simplemente un artefacto de tratar de mantener el complemento de dos simple.


Entonces, ¿es la representación de -128 10000000 o 110000000? ¿Es la representación un poco dependiente?

Sí, la representación del complemento de 2 es un poco dependiente

¿Por qué no simplemente hacer el rango inferior -127 para 8 bits en lugar de escribir -128 como 10000000

2 ^ 8 = 256. Por lo tanto, cualquier esquema de representación que use, debería poder representar 256 valores diferentes.

Y puedes dibujar un círculo para entender qué tan bueno es el sistema de complemento de 2.

Primer vistazo a esta tabla:

Bits Unsigned 2''s complement 00000000 0 0 00000001 1 1 00000010 2 2 01111110 126 126 01111111 127 127 10000000 128 −128 10000001 129 −127 10000010 130 −126 11111110 254 −2 11111111 255 −1

para el sistema de complemento de 2 puede dibujar un círculo para comprender este sistema.

Aquí está la versión de 4 bits. Puedes desarrollar fácilmente una versión de 8 bits en ti mismo. Este círculo representa lo que realmente es el sistema de complemento de este 2. Es un sistema circular. Eso significa que su representación depende del "lapso" que se le dé. es por eso que la versión de 8 bits de un número negativo diferirá con una versión de 16 bits del mismo número negativo. puede comparar el mismo número negativo en la versión de 4 bits dada en el círculo con la versión de 8 bits dada en la tabla.

0000 0 1111 -1 0001 1 1110 -2 0010 2 1101 -3 0011 3 1100 -4 0100 4 1011 -5 0101 5 1010 -6 0110 6 1001 -7 0111 7 1000 -8

En una nota al margen, la aritmética del complemento de 2 funciona bien con almacenes de cálculo de ancho "fijo" dentro de las computadoras (registros, memoria, etc.).

En las computadoras de primera generación, hubo una tendencia a proporcionar aritmética decimal nativa. Pero esto se abandonó rápidamente en favor del esquema "complementario" o "circular" porque la aritmética decimal es extraña desde el punto de vista de una computadora. Nos parece natural porque "tenemos 10 dedos". Estos dedos fueron la herramienta de cálculo más antigua de nuestro ancestro. Es por eso que encontramos el sistema decimal tan natural. Está integrado en nuestros genes.


Las alternativas al complemento de dos serían.

  • El complemento de uno , que tiene problemas debido a su "cero negativo".
  • sign/magnitude , que también tiene un cero negativo.
  • no asigne un significado a 10000000 , en cuyo caso muchas funciones que aceptan enteros de 8 bits firmados tendrán que verificar ese valor no válido, lo que desperdicia tiempo. (A menos que su código se ejecute en un hardware hipotético que trata este patrón de bits como un NaN entero).

Es más fácil simplemente asignar un significado a ese patrón de bits, y el significado natural en la representación del complemento de los dos es -128.

Por ejemplo, en el complemento a dos, verificando si hay monturas negativas para verificar si su bit más alto está establecido. En una variante donde 10000000 no es válido, es (pseudocódigo)

if (highest_bit_zero(x)) return false; else if (x == 0b10000000) ERROR else return true;

Tú decides cómo manejar el error :)


Razón por la cual no puedes tener rango de a .

Parece que y Están representados por el mismo patrón. Esto no está bien. Un entero distinto de cero y su negativo no pueden ser representados por el mismo patrón. Asi que No se puede representar en ocho bits. El entero positivo máximo que se puede representar en ocho bits es .

¿Qué número está representado por 1000 0000? Añade la representación de lo:

Una buena opción para? es . Por lo tanto 1000 0000 representa . Se pueden usar ocho bits para representar los números. ... 0 ... .

Por ejemplo, el rango de enteros que se pueden representar en ocho bits utilizando el complemento de dos es:

Observe que se puede representar un entero más negativo que los enteros positivos.

Fuente: - http://programmedlessons.org/AssemblyTutorial/Chapter-08/ass08_20.html