El complemento de
2 solo se puede utilizar para representar números enteros.
Sin embargo, una solución, podría usar dos valores de complemento de 2, uno para escalar el otro. Por ejemplo, para representar -5/8 puede tener dos variables, que contienen valores (-5, -8) o para una aritmética más simple, (-5, -3) donde -3 representa el número de desplazamientos de bits.
Otra solución podría ser tener un cambio implícito. Por ejemplo, podría usar un número complementario de 16 bits y 2 para representar valores de -256 a +255. En ese caso, el bit más significativo sería el signo, los 8 bits inferiores serían el número entero y los 7 bits más bajos serían la fracción.
Podrías arreglar esto como quieras. Por ejemplo, podría usar solo 8 bits y tener el siguiente significado de bit:
- (bit 7) Iniciar sesión
- (bit 6) 8's
- (bit 5) 4's
- (bit 4) 2's
- (bit 3) 1's
- (bit 2) mitades
- (bit 1) trimestres
- (bit 0) octavos
Esto le daría valores en octavos incrementos, en los siguientes rangos:
Positivo: 0 a 15.875
Negativo: -0.125 a -16
Según el comentario de AndrejaKo, esta es una representación de punto fijo.
Un ejemplo de posibles representaciones utilizando un número binario de 4 bits
Binary | Regular 2's comp. | /16 2's comp | /8 2's comp
------ | ----------------- | --------------- | ------------
0000 0 0 (0) 0
0001 1 0.0625 (1/16) 0.125 (1/8)
0010 2 0.125 (2/16) 0.25 (2/8)
0011 3 0.1875 (3/16) 0.325 (3/8)
0100 4 0.25 (4/16) 0.5 (4/8)
0101 5 0.3125 (5/16) 0.625 (5/8)
0110 6 0.325 (6/16) 0.75 (6/8)
0111 7 0.4375 (7/16) 0.825 (7/8)
1111 -1 -0.0625 (-1/16) -0.125 (1/8)
1110 -2 -0.125 (-2/16) -0.25 (-2/8)
1101 -3 -0.1875 (-3/16) -0.325 (-3/8)
1100 -4 -0.25 (-4/16) -0.5 (-4/8)
1011 -5 -0.3125 (-5/16) -0.625 (-5/8)
1010 -6 -0.325 (-6/16) -0.75 (-6/8)
1001 -7 -0.4375 (-7/16) -0.825 (-7/8)
1000 -8 -0.5 (-8/16) -1 (-8/8)
Como puedes ver, 1011 representa -5 en el complemento de dos. Entonces, si tiene un cambio de bit implícito de 3, (equivalente a dividir por 8), representa -5/8.
De forma similar, si está utilizando 5 bits, donde tiene una división implícita por 16, el valor del bit sería 10110, donde el 1 al principio denota el signo, y 0110 en el contexto del bit con signo complementario del 2 representa 5 / 8.
Aquí es de donde viene su "0110":
Binary | Reg. 2's comp. | /16 2's comp
------ | -------------- | ---------------
11111 -1 -0.0625 (-1/16)
11110 -2 -0.125 (-2/16)
11101 -3 -0.1875 (-3/16)
11100 -4 -0.25 (-4/16)
....
10111 -9 -0.5625 (-9/16)
10110 -10 -0.625 (-10/16) <== where "0110" equals -5/8
10101 -11 -0.6875 (-11/16)