Quando usar valores não assinados sobre aqueles assinados?

votos
66

Quando é apropriado usar uma variável sem sinal sobre um assinado? Que tal em um forloop?

Eu ouço um monte de opiniões sobre isso e eu queria ver se havia algo semelhante a 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 tem valores não assinados, e que deve ter sido uma decisão consciente sobre a Sun Microsystems parte '.

Publicado 02/08/2008 em 04:34
fonte usuário
Em outras línguas...                            


5 respostas

votos
61

Fiquei contente de encontrar uma boa conversa sobre este assunto, como eu não tinha realmente dado muita atenção antes.

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

Se você estiver indo para fazer as coisas bit a bit como máscaras, começa não assinados a fazer mais sentido. Ou, se você está desesperado para obter essa faixa positiva extra, aproveitando o bit de sinal.

Pessoalmente, eu gosto assinado porque eu não confio em mim mesmo para ficar consistente e evitar a mistura dos dois tipos (como o artigo adverte contra).

Respondeu 02/08/2008 em 04:49
fonte usuário

votos
8

No seu exemplo acima, quando 'i' será sempre positivo e uma gama maior seria benéfica, não assinado seria útil. Como se você está usando declarações 'Declare', tais como:

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

Especialmente quando esses valores nunca vai mudar.

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

Concordo com santo no entanto, que uma boa regra é usar assinado, que C na verdade, o padrão é, então você está coberto.

Respondeu 02/08/2008 em 05:31
fonte usuário

votos
7

Gostaria de pensar que, se o seu caso de negócio dita que um número negativo é inválido, você quer ter um erro mostrada ou lançada.

Com isso em mente, eu apenas recentemente descobriu sobre inteiros sem sinal, enquanto trabalhava em um processamento de dados de projeto em um arquivo binário e armazenar os dados em um banco de dados. I foi propositadamente "corromper" os dados binários, e acabou recebendo valores negativos em vez de um erro esperado. Descobri que, mesmo que o valor convertido, o valor não era válido para o meu caso de negócio.
Meu programa não erro, e acabei recebendo dados errados no banco de dados. Teria sido melhor se eu tivesse usado uinte tinha o programa falhar.

Respondeu 10/11/2008 em 20:04
fonte usuário

votos
7

Compiladores C e C ++ irá gerar um aviso quando você compara assinado e tipos não assinados; em seu código exemplo, você não pode fazer o seu variável de laço não assinado e ter o compilador gerar código sem avisos (assumindo que disse advertências foram ligado).

Naturalmente, você está compilando com avisos virou todo o caminho até, certo?

E, você já pensou em compilar com "tratar avisos como erros" para levá-lo um passo além?

A desvantagem com o uso de números assinados é que há uma tentação de sobrecarregar-los para que, por exemplo, os valores 0-> n são a seleção de menu, e -1 não significa nada está selecionado - em vez de criar uma classe que tem duas variáveis, uma para indicar se algo é selecionado e outra para armazenar o que a seleção é. Antes que você perceba, você está testando para um negativo em todo o lugar e o compilador está reclamando sobre como você está querendo comparar a seleção de menu contra o número de opções de menu que você tem - mas isso é perigoso, porque eles são diferentes tipos . Portanto, não faça isso.

Respondeu 04/08/2008 em 14:35
fonte usuário

votos
6

size_tmuitas vezes é uma boa escolha para isso, ou size_typese você estiver usando uma classe STL.

Respondeu 02/08/2008 em 06:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more