Con un fondo de matemáticas puras, esta es una versión ligeramente más matemática para cualquier persona interesada.
Si comenzamos con un entero de 8 bits con signo y sin signo, lo que tenemos son básicamente los enteros módulo 256, en lo que respecta a la suma y la multiplicación, siempre que el complemento de 2 se utilice para representar enteros negativos (y así es como todo procesador moderno lo hace).
Donde las cosas difieren es en dos lugares: uno es operaciones de comparación. En cierto sentido, los enteros modulo 256 se consideran mejor como un círculo de números (como los enteros modulo 12 en una esfera analógica antigua). Para hacer significativas las comparaciones numéricas (es x < y), necesitamos decidir qué números son menos que otros. Desde el punto de vista del matemático, queremos incrustar los enteros modulo 256 en el conjunto de todos los enteros de alguna manera. Asignar el entero de 8 bits cuya representación binaria es todos ceros al entero 0 es lo más obvio. Luego podemos proceder a mapear otros para que '0 + 1' (el resultado de poner a cero un registro, digamos ax, y su incremento en uno, a través de 'inc ax') vaya al número entero 1, y así sucesivamente. Podemos hacer lo mismo con -1, por ejemplo, asignando '0-1' al entero -1, y '0-1-1' al entero -2. Debemos asegurarnos de que esta integración sea una función, por lo que no se puede asignar un solo entero de 8 bits a dos enteros. Como tal, esto significa que si asignamos todos los números al conjunto de enteros, 0 estará allí, junto con algunos enteros menores que 0 y algunos más que 0. Hay esencialmente 255 formas de hacerlo con un entero de 8 bits (según a que mínimo desea, de 0 a -255). Entonces puedes definir 'x < y 'en términos de' 0 < y - x '.
Hay dos casos de uso comunes, para los cuales el soporte de hardware es sensato: uno con todos los enteros distintos de cero es mayor que 0, y uno con una división de aproximadamente 50/50 alrededor de 0. Todas las demás posibilidades se pueden emular fácilmente al traducir números a través de un extra 'agregue y sub' antes de las operaciones, y la necesidad de esto es tan rara que no puedo pensar en un ejemplo explícito en software moderno (ya que puede trabajar con una mantisa más grande, digamos 16 bits).
El otro problema es el de la asignación de un entero de 8 bits en el espacio de enteros de 16 bits. ¿-1 va a -1? Esto es lo que quieres si 0xFF pretende representar -1. En este caso, la extensión de la señal es lo más sensato, de modo que 0xFF pase a 0xFFFF. Por otro lado, si se suponía que 0xFF representaba 255, entonces desea que se asigne a 255, por lo tanto, a 0x00FF, en lugar de a 0xFFFF.
Esta es la diferencia entre las operaciones de 'cambio' y 'cambio aritmético' también.
Sin embargo, en última instancia, todo se reduce al hecho de que los int en software no son enteros, sino representaciones en binario, y solo algunos pueden representarse. Al diseñar el hardware, se deben tomar decisiones respecto de qué hacer de forma nativa en el hardware. Dado que con el complemento a 2 las operaciones de suma y multiplicación son idénticas, tiene sentido representar los enteros negativos de esta manera. Entonces es solo una cuestión de operaciones que dependen de qué enteros se supone que representan sus representaciones binarias.