Pergunta

Eu vi estes mencionado no contexto de C e C ++, mas o que é a diferença entre variáveis ??assinados e não assinados?

Foi útil?

Solução

variáveis ??assinados , como inteiros assinados irá permitem que você para representar números, tanto nas faixas positivos e negativos .

variáveis ??não assinados , como inteiros sem sinal, irá só permitem que você para representar números no positivo .

sem sinal e variáveis ??assinadas do mesmo tipo (tal como int e byte) ambos têm a mesma gama (gama de 65.536 e 256 números, respectivamente), mas não assinado pode representar um número de magnitude maior do que a variável assinado correspondentes .

Por exemplo, um unsigned byte pode representar valores de 0 para 255, enquanto signed byte pode representar -128 para 127.

Wikipedia página sobre representação de números com sinal explica a diferença na representação no nível do bit, e integer (informática) página fornece uma tabela de intervalos para cada inteiro assinado / unsigned tipo.

Outras dicas

Embora comumente referido como um 'bit de sinal', os valores binários geralmente usamos não tem um bit de sinal verdadeiro.

A maioria dos computadores usar complemento de dois aritmética. Os números negativos são criados tomando o one' s de complemento (flip todos os bits) e adicionando um:

5 (decimal) -> 00000101 (binary)
1's complement: 11111010
add 1: 11111011 which is 'FB' in hex


É por isso que um byte assinado detém valores de -128 a +127, em vez de -127 a +127:

1 0 0 0 0 0 0 0 = -128
1 0 0 0 0 0 0 1 = -127
- - -
1 1 1 1 1 1 1 0 = -2
1 1 1 1 1 1 1 1 = -1
0 0 0 0 0 0 0 0 = 0
0 0 0 0 0 0 0 1 = 1
0 0 0 0 0 0 1 0 = 2
- - -
0 1 1 1 1 1 1 0 = 126
0 1 1 1 1 1 1 1 = 127
(Adicionar 1 a 127 dá :)
1 0 0 0 0 0 0 0 que vemos no topo deste gráfico é -128.


Se tivéssemos um pouco sinal apropriado, o intervalo de valores seria o mesmo (por exemplo, -127 a +127) porque um bit é reservado para o sinal. Se o significativo-bit mais é o bit de sinal, teríamos:

5 (decimal) -> 00000101 (binary)
-5 (decimal) -> 10000101 (binary)

O interessante neste caso é que temos tanto um zero e um negativo zero:
0 (decimal) -> 00000000 (binary)
-0 (decimal) -> 10000000 (binary)


Não temos -0 com complemento de dois; o que seria -0 é -128 (ou para ser mais geral, mais um do que o maior valor positivo). Eu faço isto com um complemento embora; todos os bits 1 é negativo 0.

Matematicamente, -0 é igual a 0. Lembro-me vagamente um computador onde -0 <0, mas não consigo encontrar qualquer referência a isso agora.

variáveis ??assinados usar um pouco a bandeira sejam eles positivos ou negativos. variáveis ??não assinados não tem esse pouco, para que eles possam armazenar números maiores no mesmo espaço, mas apenas números não negativos, por exemplo, 0 e superior.

Para obter mais: não assinado e assinado inteiros

variáveis ??não assinados só podem ser números positivos, porque eles não têm a capacidade para indicar que eles são negativos.

Esta capacidade é chamado de 'sinal' ou 'assinar pouco'.

Um efeito colateral é que, sem um pouco de assinatura, eles têm mais um pouco que pode ser usado para representar o número, dobrando o número máximo que pode representar.

variáveis ??assinados pode ser 0, positivo ou negativo.

variáveis ??não assinados pode ser 0 ou positivo.

variáveis ??não assinadas são usados ??às vezes porque mais bits pode ser usado para representar o valor real. Dando-lhe uma maior gama. Além disso, você pode garantir que um valor negativo não será passado para a função, por exemplo.

não assinado é utilizado quando ur valor deve ser positivo, sem valor negativo aqui, se assinado para a gama int -32.768-32.767 se não assinado para a gama int 0 a 65535

variáveis ??não assinados são variáveis ??que são representados internamente, sem um sinal matemático (mais ou menos) pode armazenar 'zero' ou valores positivos apenas . Digamos que a variável não assinada é n bits em tamanho, em seguida, ele pode representar 2 ^ n (2 poder n) valores - de 0 a (2 ^ n-1). Uma variável assinado por outro lado, 'perde' um bit para representar o sinal, de modo que pode armazenar os valores a partir de - (2 ^ (n-1) -1) através de (2 ^ (n-1)), incluindo zero. Assim, um variável assinado pode armazenar valores positivos, valores negativos e zero .

P.S:.
Internamente, o sinal matemático pode ser representado em sua forma de complemento, a forma de complemento de dois ou com um bit de sinal (por exemplo: 0 -> +, 1-> -)
Todos estes métodos dividir eficazmente o intervalo de valores representáveis ??em n bits (2 ^ n) em três partes, positiva, negativa e nula.

Este é apenas o meu valor de dois centavos.

Espero que isso ajude.

Esta não pode ser a definição exata, mas eu vou te dar um exemplo: Se você fosse criar um número aleatório levá-lo a partir do momento do sistema, aqui usando a variável não assinado é benéfico porque não há grande espaço para números aleatórios como números assinados dar tanto positivos como números negativos. À medida que a hora do sistema não pode ser negativo usamos variável unsigned (Somente números positivos) e temos mais ampla gama de números aleatórios.

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