Cuando asigna un valor negativo a una variable sin signo, utiliza el método de complemento a 2 para procesarla y, en este método, cambia todos los 0 a 1 y todos los 1 a 0 y luego le agrega 1. En su caso, está tratando con int, que es de 4 bytes (32 bits), por lo que intenta usar el método de complemento a 2 en un número de 32 bits, lo que hace que el bit superior se invierta. Por ejemplo:
┌─[student@pc]─[~]
└──╼ $pcalc 0y00000000000000000000000000000101 # 5 in binary
5 0x5 0y101
┌─[student@pc]─[~]
└──╼ $pcalc 0y11111111111111111111111111111010 # flip all bits
4294967290 0xfffffffa 0y11111111111111111111111111111010
┌─[student@pc]─[~]
└──╼ $pcalc 0y11111111111111111111111111111010 + 1 # add 1 to that flipped binarry
4294967291 0xfffffffb 0y11111111111111111111111111111011
nVal = (unsigned int) -5;
. El reparto de-5
tounsigned int
se define en 6.3.1.3. La representación en complemento a 2 no es obligatoria por el estándar, pero el algoritmo para convertir a unsigned es: "el valor se convierte agregando o restando repetidamente uno más del valor máximo que se puede representar en el nuevo tipo hasta que el valor esté en el rango del nuevo tipo ".