Qual é a diferença entre as variáveis ??assinados e não assinados?
-
05-07-2019 - |
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?
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
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.