Inteiros não assinados estão lá por um motivo.
Considere, por exemplo, entregar dados como bytes individuais, por exemplo, em um pacote de rede ou em um buffer de arquivo. Ocasionalmente, você pode encontrar animais como números inteiros de 24 bits. Desloque facilmente os bits de três números inteiros não assinados de 8 bits, não tão fácil com números inteiros assinados de 8 bits.
Ou pense em algoritmos usando tabelas de pesquisa de caracteres. Se um caractere for um número inteiro não assinado de 8 bits, você poderá indexar uma tabela de pesquisa por um valor de caractere. No entanto, o que você faz se a linguagem de programação não suportar números inteiros não assinados? Você teria índices negativos para uma matriz. Bem, acho que você poderia usar algo assim, charval + 128
mas isso é simplesmente feio.
De fato, muitos formatos de arquivo usam números inteiros não assinados e, se a linguagem de programação do aplicativo não suportar números inteiros não assinados, isso pode ser um problema.
Em seguida, considere os números de sequência TCP. Se você escrever qualquer código de processamento TCP, definitivamente desejará usar números inteiros não assinados.
Às vezes, a eficiência é tão importante que você realmente precisa desse bit extra de números inteiros não assinados. Considere, por exemplo, dispositivos de IoT que são enviados em milhões. Muitos recursos de programação podem ser justificados para serem gastos em micro-otimizações.
Eu argumentaria que a justificativa para evitar o uso de tipos inteiros não assinados (aritmética de sinais mistos, comparações de sinais mistos) pode ser superada por um compilador com avisos adequados. Esses avisos geralmente não são ativados por padrão, mas veja, por exemplo, -Wextra
ou separadamente -Wsign-compare
(ativado automaticamente em C por -Wextra
, embora eu não ache que seja ativado automaticamente em C ++) e -Wsign-conversion
.
No entanto, em caso de dúvida, use um tipo assinado. Muitas vezes, é uma escolha que funciona bem. E ative esses avisos do compilador!