Vou entrar em diferenças no nível do hardware, no x86. Isso é irrelevante, a menos que você esteja escrevendo um compilador ou usando a linguagem assembly. Mas é bom saber.
Primeiro, o x86 tem suporte nativo para a representação complementar de dois dos números assinados. Você pode usar outras representações, mas isso exigiria mais instruções e geralmente seria um desperdício de tempo do processador.
O que quero dizer com "suporte nativo"? Basicamente, quero dizer que há um conjunto de instruções que você usa para números não assinados e outro que você usa para números assinados. Os números não assinados podem ficar nos mesmos registros que os números assinados e, de fato, você pode misturar instruções assinadas e não assinadas sem preocupar o processador. Cabe ao compilador (ou programador de montagem) acompanhar se um número é assinado ou não e usar as instruções apropriadas.
Em primeiro lugar, os números de complemento de dois têm a propriedade de que adição e subtração são iguais às de números não assinados. Não faz diferença se os números são positivos ou negativos. (Então você só ir em frente e ADD
e SUB
seus números sem uma preocupação.)
As diferenças começam a aparecer quando se trata de comparações. O x86 tem uma maneira simples de diferenciá-los: acima / abaixo indica uma comparação não assinada e maior / menor que indica uma comparação assinada. (Por exemplo, JAE
significa "Salte se for acima ou igual" e não está assinado.)
Existem também dois conjuntos de instruções de multiplicação e divisão para lidar com números inteiros assinados e não assinados.
Por fim: se você deseja verificar, digamos, estourar, faria de maneira diferente para números assinados e não assinados.