Con un fondo matemático puro, esta es una toma un poco más matemática para cualquier persona interesada.
Si comenzamos con un entero de 8 bits con signo y sin signo, lo que tenemos es básicamente el módulo 256 de enteros, en lo que respecta a la suma y la multiplicación, siempre que el complemento de 2 se use para representar enteros negativos (y así es como lo hace todo procesador moderno) .
Donde las cosas difieren es en dos lugares: uno es las operaciones de comparación. En cierto sentido, los números enteros módulo 256 se consideran mejor un círculo de números (como lo hacen los números enteros módulo 12 en una esfera de reloj analógica anticuada). Para que las comparaciones numéricas (es x <y) sean significativas, necesitamos decidir qué números son menores que otros. Desde el punto de vista del matemático, queremos integrar los enteros módulo 256 en el conjunto de todos los enteros de alguna manera. Mapear el entero de 8 bits cuya representación binaria es todos ceros al entero 0 es lo 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, mapeando '0-1' al entero -1 y '0-1-1' al entero -2. Debemos asegurarnos de que esta incrustació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. Existen esencialmente 255 formas de hacer esto con un entero de 8 bits (de acuerdo con a qué mínimo desea, de 0 a -255). Luego puede 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 que son mayores que 0, y otro con un 50/50 aproximadamente dividido alrededor de 0. Todas las demás posibilidades se emulan fácilmente traduciendo números mediante un 'add adicional y sub 'antes de las operaciones, y la necesidad de esto es tan rara que no puedo pensar en un ejemplo explícito en el software moderno (ya que puede trabajar con una mantisa más grande, digamos 16 bits).
El otro problema es el de mapear un entero de 8 bits en el espacio de enteros de 16 bits. ¿-1 va a -1? Esto es lo que quiere si 0xFF está destinado a representar -1. En este caso, la extensión de señal es lo más sensato, para que 0xFF vaya a 0xFFFF. Por otro lado, si 0xFF estaba destinado a representar 255, entonces desea asignarlo a 255, por lo tanto, a 0x00FF, en lugar de 0xFFFF.
Esta es la diferencia entre las operaciones de 'desplazamiento' y 'desplazamiento aritmético' también.
Sin embargo, en última instancia, se reduce al hecho de que los int en el software no son enteros, sino representaciones en binario, y solo algunos pueden representarse. Cuando se diseña hardware, se deben elegir qué hacer de forma nativa en hardware. Dado que con el complemento de 2 las operaciones de suma y multiplicación son idénticas, tiene sentido representar enteros negativos de esta manera. Entonces es solo una cuestión de operaciones que dependen de los enteros que sus representaciones binarias deben representar.