El estándar C no exige ninguna forma particular de representar números con signo negativo.
En la mayoría de las implementaciones que es probable que encuentre, los enteros con signo negativo se almacenan en lo que se llama complemento de dos . La otra forma importante de almacenar números con signo negativo se llama complemento de uno .
El complemento de dos de un número de N bits x
se define como 2^N - x
. Por ejemplo, el complemento de dos de 8 bits 1
es 2^8 - 1
, o 1111 1111
. El complemento de dos de 8 bits 8
es 2^8 - 8
, que en binario es 1111 1000
. Esto también se puede calcular volteando los bits x
y agregando uno. Por ejemplo:
1 = 0000 0001
~1 = 1111 1110
~1 + 1 = 1111 1111
-1 = 1111 1111
21 = 0001 0101
~21 = 1110 1010
~21 + 1 = 1110 1011
-21 = 1110 1011
El complemento de uno de un número x de N bits se define como x con todos sus bits invertidos, básicamente.
1 = 0000 0001
-1 = 1111 1110
21 = 0001 0101
-21 = 1110 1010
El complemento a dos tiene varias ventajas sobre el complemento a uno. Por ejemplo, no tiene el concepto de 'cero negativo', que por una buena razón es confuso para muchas personas. La suma, la multiplicación y la resta funcionan de la misma manera con enteros con signo implementados con dos complementados como lo hacen también con enteros sin signo.