19

leí Why is the range of bytes -128 to 127 in Java? dice¿Por qué el rango del byte firmado es de -128 a 127 (complemento de 2) y no de -127 a 127?

128 es 10000000. invertido, es 01.111.111, y añadiendo uno tiene 10000000 nuevo

por lo que concluye -128 10000000 se

por lo + 128 no se puede representar en 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, tomando su complemento 2 -128 es 110000000,

por lo que es la representación de -128 10000000 o 110000000? ¿La representación es dependiente de bit?

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

Respuesta

34

¿Por qué el rango de bytes sin signo va de -128 a 127?

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

El rango de un firmó de bytes mediante el complemento a 2 es de -128 a 127, directamente de la definición de 2's complement:

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

por lo que es la representación de -128 10000000 o 110000000?

En 8 bits, es 10000000, en un hipotético representación de 9 bits que es 110000000.

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

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

+3

cuando empecé a escribir mi respuesta, su respuesta fue un chiste. Ahora veo que, en su mayoría, obsoleta mi respuesta. ¿Siempre haces esto? me refiero a responder un trazador de líneas para agarrar el lugar del primer respondedor, y luego mejorarlo gradualmente? Mirando a tu REP, supongo que eres bueno en esta técnica. +1 – Aftnix

+1

@Aftnix: Originalmente fue de una sola línea porque pensé que esa era toda la pregunta requerida. Entonces alguien lo votó negativamente, ¡así que pensé que debería mejorarlo! –

+0

Lo siento, quise decir sin ofender. – Aftnix

6

Las alternativas al complemento de dos serían

  • one's complement, que tiene problemas debido a su "cero negativo"
  • sign/magnitude, que también tiene un cero negativo
  • no asignar un significado a 10000000, en cuyo caso, muchas funciones que aceptan enteros de 8 bits firmados deberán verificar ese valor inválido, perdiendo tiempo. (A menos que su código se ejecuta en hardware hipotético de que trata este patrón de bits como un número entero NaN.)

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

Por ejemplo, en el complemento a dos, verificar si los montajes negativos son para verificar si está configurado su bit más alto. En una variante en la que 10000000 no es válido, es (pseudocódigo)

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

Usted decide cómo manejar el error :)

+0

La otra gran alternativa es el signo/magnitud, que también tiene un cero negativo. Los estándares ISO C y C++ especifican que los tipos enteros con signo pueden ser complemento de dos, complemento de uno o signo/magnitud. –

+0

Si simplemente no permites '-128', podrías tratarlo como un NaN, al igual que lo hace el punto flotante. Si usa la misma semántica que IEEE FP, una comparación podría tener 4 resultados: mayor, igual, menor o desordenado. Entonces 'x <0' sería falso (desordenado) si' x' fuera '0x80'. Pero 'x> 0' también sería falso, y también' x == 0'. Entonces, 'x == x'. –

3

también lo es la representación de -128 10000000 o 110000000? ¿La representación es poco dependiente?

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

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

Como larsmans señaló, usted terminaría con un valor "inválido", que usted tendría que comprobar constantemente. Se ha elegido el complemento de dos 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 siempre fue el caso). A nivel de hardware, la adición de dos complementos 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 bit más alto establecido son negativos, todos los valores con el bit más alto no son negativos (positivo o cero). Fácil, ¿no? El rango negativo que es uno más grande que el rango positivo es simplemente un artefacto de tratar de mantener el complemento de dos simple.

15

por lo que es la representación de -128 10000000 o 110000000? ¿La representación es poco dependiente?

Sí, representación de complemento a 2 es poco dependiente

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

2^8 = 256 Por lo tanto, cualquiera que sea el esquema de representación que use, debería ser capaz de representar 256 valores diferentes.

Y puede dibujar un círculo para comprender 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 a 2 se puede dibujar el círculo para la comprensión de este sistema.

Aquí está la versión de 4 bits. Puede desarrollar fácilmente una versión de 8 bits en usted mismo. Este círculo representa lo que es en realidad el sistema de complemento a 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 que se proporciona en el círculo con la versión de 8 bits que se proporciona 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 lateral, de 2 aritmética de complemento juega bien con los almacenamientos "fijos" ancho de cálculo dentro de los ordenadores (registros, memoria, etc.).

En computadoras de primera generación, había una tendencia a proporcionar aritmética decimal nativa. Pero esto fue rápidamente abandonado en favor del esquema "complementado" o "circular" porque la aritmética decimal es extraña desde el punto de vista de una computadora. Lo encontramos natural porque "tenemos 10 dedos". Estos dedos fueron la herramienta de computación más antigua de nuestros antepasados. Es por eso que encontramos un sistema decimal tan natural. está integrado en nuestros genes.

+1

+1 Para ponerlo en un lenguaje más matemático, complementos 2s firmados y no firmados simplemente use representantes diferentes para el módulo aritmético 256. Lo que implica que la suma y la multiplicación dan como resultado el mismo patrón de bits, independientemente de la representación con signo o sin signo. – starblue

+0

* Eso significa que su representación depende del "lapso" que le brinde.* Pero el patrón es muy simple. La extensión de señal a un tipo más amplio solo significa copiar el bit alto a todos los bits nuevos. –

+0

Ditto @starblue sobre las ventajas de usar el complemento de dos - de [Wikipedia] (https://en.wikipedia.org/wiki/Two%27s_complement): "* La suma de un número y su complemento de dos siempre será igual a 0 (dado que el último dígito está truncado), y la suma de un número y su complemento siempre será igual a 0. El sistema complementario de dos tiene la ventaja de que las operaciones aritméticas fundamentales de suma, resta y multiplicación son idénticas a las de números binarios sin signo * ". – ruffin

2

Motivo de por qué no puede tener rango de enter image description here a enter image description here.

Parece que enter image description here y enter image description here están representados por el mismo patrón. Esto no está bien. Un entero distinto de cero y su negativo no se pueden representar con el mismo patrón. Por lo tanto, enter image description here no se puede representar en ocho bits. El entero positivo máximo que se puede representar en ocho bits es enter image description here.

¿Qué número representa 1000 0000? Añadir la representación de enter image description here a ella:

enter image description here

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

enter image description here

Por ejemplo, el intervalo de números enteros que pueden ser representados en ocho bits usando complemento de dos es:

Example

en cuenta que un entero más negativo puede ser representado de enteros positivos.

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

Cuestiones relacionadas