La forma en que me gusta pensar acerca de los números del complemento de dos es pensar qué pasa con los bits más bajos de un número binario al restar. Si los 4 bits inferiores de x son 0000 y los cuatro bits inferiores de y son 0001, entonces los cuatro bits inferiores de x-y serán 1111 independientemente de qué bits estén por encima de ellos. Esto se puede generalizar fácilmente para cualquier número particular de bits (restando un número cuyos bits inferiores expresan el valor 1 de un número cuyos bits inferiores expresan el valor 0 producirá un número cuyos bits inferiores están todos configurados). Como eso funcionará para cualquier número de bits, puede generalizarse aún más para decir que al restar uno de cero se obtendrá un número con un número infinito de bits establecido.
En la práctica, almacenar un número infinito de bits no es práctico. Para cualquier N & gt = 1, sin embargo, todos los números dentro del rango - (2 ^ N) a (2 ^ N) -1, sin embargo, todos los bits a la izquierda del bit Nth (contando a la izquierda) tendrán el mismo valor que el Nth bit en sí, y por lo tanto no necesita ser almacenado. Por lo tanto, cuando se utilizan valores de complemento a dos de 8 bits, el valor -1 no es "realmente" 10000000, sino que es [número infinito de 1s] 0000000, y el valor 127 no es 01111111, sino [número infinito de 0s] 1111111. Ver las cosas de esta manera dejará en claro cómo deberían funcionar las conversiones entre diferentes tamaños de valores.
Por ejemplo, convertir el valor de 8 bits a 16 bits simplemente implicaría copiar parte de la cadena inifinita de 1s o ceros, mientras que la conversión de un valor de 16 bits en el rango -128..127 a 8 bits implicaría dejando caer algunos bits duplicados. Si un número de 16 bits está fuera de ese rango, convertirlo a 8 bits generaría el valor que resultaría de copiar el bit retenido más singular.
PS: aplicando la fórmula de suma de potencia 1 + 2 + 4 + 8 ... produce -1. Eso puede parecer absurdo, pero encaja perfectamente con el funcionamiento de las matemáticas de dos. Para cualquier valor de N, si todos los N bits inferiores de un número están configurados, la adición de 1 dará como resultado un número cuyos N bits inferiores están claros. El único número para el que se borrarán los N bits inferiores para todos los valores de N es cero, y el único número que dará 0 cuando se le agregue 1 es, por supuesto, -1.