Porquê o intervalo de int é-32768 a 32767? [fechado]

Por que razão a gama de qualquer tipo de dados é maior do lado negativo em comparação com o lado positivo?

por exemplo, no caso de um número inteiro:

em Turbo C o seu alcance é -32768 a 32767 e para Visual Studio é -2147483648 a 2147483647.

o mesmo acontece com outros tipos de dados...

[UPD: fixar valores-limite adequados para Visual Studio]

Author: skondratov, 2013-09-01

5 answers

Devido à forma como os números são armazenados. Os números assinados são armazenados usando algo chamado "Notação complementar de dois".

Lembre-se que todas as variáveis têm uma certa quantidade de bits. Se o mais significativo deles, o da esquerda, é um 0, então o número é não-negativo (isto é, positivo ou zero), e o resto dos bits representam simplesmente o valor.

No entanto, se o bit mais à esquerda é um 1, Então o número é negativo. O valor real do número pode ser obtido por subtraindo 2^n do número inteiro representado (como uma quantidade sem sinal, incluindo a mais à esquerda 1), onde n é a quantidade de bits que a variável tem.

Uma vez que só restam n - 1 bits para o valor real (o "mantissa") do número, as combinações possíveis são 2^(n-1). Para números positivos / zero, Isso é fácil: eles vão de 0, para 2^(n - 1) - 1. Esse -1 é contabilizar o próprio zero -- por exemplo, se você tivesse apenas quatro combinações possíveis, essas combinações representariam 0, 1, 2 e 3 (Note como há quatro números): vai de 0 a 4 - 1.

Para os números negativos, lembre - se que o bit mais à esquerda é 1, por isso o número inteiro representado vai entre 2^(n - 1) e (2^n) - 1 (os parêntesis são muito importantes lá!). No entanto, como disse, É preciso tirar 2% para obter o valor real do número. 2^(n - 1) - 2^n -(2^(n - 1)) e ((2^n) - 1) - 2^n -1. Portanto, o intervalo dos números negativos é - (2^(n-1)) A -1.

Junta isso tudo e recebes - 2^(n-1) a 2^(n - 1) - 1. Como você pode ver, o limite superior recebe um -1 que o limite inferior não. E é por isso que há mais um número negativo do que positivo.
 33
Author: aaaaaa123456789, 2013-09-01 12:11:53

O intervalo mínimo exigido por C é na verdade-32767 até 32767, porque tem que atender para o complemento de dois, complemento de um e codificação de sinal/magnitude para números negativos, todos os quais o padrão C permite. Ver Annex E, Implementation limits de C11 (e C99) para mais pormenores sobre os intervalos mínimos para os tipos de dados.

A sua pergunta diz respeito apenas à variante complementar dos dois e a razão para isso é simples. Com 16 bits, você pode representar 216 (ou 65,536) valores diferentes e zero tem ser um desses. Portanto, há um número ímpar de valores restantes, dos quais a maioria (por um) são valores negativos:
 1 thru  32767  = 37267 values
 0              =     1 value
-1 thru -32768  = 32768 values
                  -----
                  65536 values

Tanto o complemento de cada um como a codificação de signo-magnitude permitem um valor negativo-zero (assim como positivo-zero), o que significa que um padrão de menos um bit está disponível para os números não-zero, daí o intervalo mínimo reduzido que você encontra no padrão.

 1 thru  32767  = 37267 values
 0              =     1 value
-0              =     1 value
-1 thru -32767  = 32767 values
                  -----
                  65536 values

O complemento de dois é na verdade um esquema de codificação nifty porque números positivos e negativos podem ser adicionados juntamente com o mesmo hardware simples. Outros esquemas de codificação tendem a exigir hardware mais elaborado para fazer a mesma tarefa.

Para uma explicação mais completa sobre como funciona o complemento de dois, veja a Página da Wikipédia .

 14
Author: paxdiablo, 2017-12-29 10:08:26

Com os números negativos do complemento 2s são definidos como os bit-wise não mais 1, o que reduz a gama de números possíveis num dado número de bits por 1 no lado negativo.

 0
Author: Steve Barnes, 2013-09-01 12:11:05

Porque o intervalo inclui zero. O número de valores diferentes que um inteiro de N-bit pode representar é 2^n. isso significa que um inteiro de 16-bit pode representar 65536 valores diferentes. Se for um número inteiro de 16 bits não assinado, pode representar 0-65535 (inclusive). A convenção para os inteiros assinados deve representar-32768 a 32767, -214748368 a 214748367, etc.

 0
Author: Miles Rout, 2013-09-01 12:11:14

Normalmente, devido ao uso de um sistema de complemento de dois para armazenar valores negativos, quando você vira o bit do sinal em um inteiro ele é tendencioso para o negativo.

A gama deve ser: - (2^(n-1)) - ((2^(n-1)-1)

 0
Author: Andon M. Coleman, 2013-09-01 12:11:49