Pergunta

Quando é apropriado usar uma variável não assinada em vez de uma assinada?E em um for laço?

Ouço muitas opiniões sobre isso e queria ver se havia algo parecido com um consenso.

for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.  
}

Eu sei que Java não possui valores não assinados, e essa deve ter sido uma decisão consciente Microssistemas Sun' papel.

Foi útil?

Solução

Fiquei feliz em encontrar uma boa conversa sobre este assunto, já que eu realmente não tinha pensado muito nisso antes.

Em resumo, assinado é uma boa escolha geral - mesmo quando você tem certeza de que todos os números são positivos - se você for fazer aritmética na variável (como em um caso típico de loop for).

Se você fizer coisas bit a bit, como máscaras, unsigned começará a fazer mais sentido.Ou, se você estiver desesperado para obter aquela faixa positiva extra, aproveitando o sinal.

Pessoalmente, gosto de assinado porque não confio em mim mesmo para permanecer consistente e evito misturar os dois tipos (como alerta o artigo).

Outras dicas

No seu exemplo acima, quando 'i' sempre será positivo e um intervalo mais alto seria benéfico, unsigned seria útil.Como se você estivesse usando instruções 'declare', como:

#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

Principalmente quando esses valores nunca mudarão.

No entanto, se você estiver fazendo um programa de contabilidade onde as pessoas são irresponsáveis ​​com seu dinheiro e estão constantemente no vermelho, você definitivamente desejará usar 'assinado'.

Eu concordo com saint, porém, que uma boa regra é usar assinado, que na verdade é o padrão de C, então você está coberto.

Os compiladores C e C++ gerarão um aviso quando você comparar tipos assinados e não assinados;no seu código de exemplo, você não poderia tornar sua variável de loop sem sinal e fazer com que o compilador gerasse código sem avisos (supondo que os avisos estivessem ativados).

Naturalmente, você está compilando com os avisos no máximo, certo?

E você já pensou em compilar com "tratar avisos como erros" para dar um passo adiante?

A desvantagem de usar números assinados é que existe a tentação de sobrecarregá-los de modo que, por exemplo, os valores 0->n sejam a seleção do menu e -1 signifique que nada está selecionado - em vez de criar uma classe que tenha duas variáveis, uma para indicar se algo está selecionado e outro para armazenar o que é essa seleção.Antes que você perceba, você está testando o negativo em todos os lugares e o compilador está reclamando sobre como você deseja comparar a seleção do menu com o número de seleções de menu que você possui - mas isso é perigoso porque são tipos diferentes .Então não faça isso.

Eu acho que se o seu caso de negócios ditar que um número negativo é inválido, você querer para que um erro seja mostrado ou lançado.

Com isso em mente, só recentemente descobri sobre números inteiros não assinados enquanto trabalhava em um projeto processando dados em um arquivo binário e armazenando os dados em um banco de dados.Eu estava "corrompendo" propositalmente os dados binários e acabei obtendo valores negativos em vez de um erro esperado.Descobri que, embora o valor fosse convertido, ele não era válido para o meu caso de negócios.
Meu programa não deu erro e acabei inserindo dados errados no banco de dados.Teria sido melhor se eu tivesse usado uint e o programa falhou.

size_t muitas vezes é uma boa escolha para isso, ou size_type se você estiver usando uma classe STL.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top