O padrão C não exige nenhuma maneira específica de representar números assinados negativos.
Na maioria das implementações que você provavelmente encontrará, números inteiros negativos assinados são armazenados no que é chamado de complemento de dois . A outra maneira principal de armazenar números negativos assinados é chamada de complemento .
O complemento de dois de um número de N bits x
é definido como 2^N - x
. Por exemplo, o complemento de 8 bits dos dois 1
é 2^8 - 1
ou 1111 1111
. O complemento de 8 bits para dois 8
é o 2^8 - 8
que é binário 1111 1000
. Isso também pode ser calculado invertendo os bits x
e adicionando um. Por exemplo:
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
O complemento de um número de N bits x é definido como x com todos os seus bits invertidos, basicamente.
1 = 0000 0001
-1 = 1111 1110
21 = 0001 0101
-21 = 1110 1010
O complemento de dois tem várias vantagens sobre o complemento de alguém. Por exemplo, ele não tem o conceito de 'zero negativo', o que por um bom motivo é confuso para muitas pessoas. A adição, multiplicação e subtração funcionam da mesma maneira com números inteiros assinados implementados com dois complementados, assim como com números inteiros não assinados.