web-dev-qa-db-fra.com

Pourquoi la valeur maximale d'un entier à n bits non signé 2 ^ n-1 et non 2 ^ n?

La valeur maximale d'un entier n- bit est 2n-1. Pourquoi avons-nous le "moins 1"? Pourquoi le maximum n'est-il pas juste 2?n?

26
Ugdu Shan

Le -1 est parce que les entiers commencent à 0, mais notre comptage commence à 1.

Ainsi, 2^32-1 est la valeur maximale pour un entier non signé de 32 bits (32 chiffres binaires). 2^32 est le nombre de valeurs possibles .

Pour simplifier, regardons le nombre décimal. 10^2-1 est la valeur maximale d'un nombre décimal à 2 chiffres (99). Étant donné que notre comptage humain intuitif commence à 1, mais que les entiers sont basés sur 0, 10^2 est le nombre de valeurs (100).

65
tenfour

2^32 en binaire:

1 00000000 00000000 00000000 00000000

2^32 - 1 en binaire:

11111111 11111111 11111111 11111111

Comme vous pouvez le constater, 2^32 prend 33 bits, alors que 2^32 - 1 est la valeur maximale d'un entier 32 bit.

La raison de l'erreur apparemment "hors-par-un" ici est que le bit le plus bas représente un, et non un. Donc, le premier bit est en fait 2^0, le second bit est 2^1, etc ...

24
Mark Kahn

232 en binaire est un suivi de 32 zéros, pour un total de 33 bits. Cela ne rentre pas dans une valeur int de 32 bits.

12
Ted Hopp

Dans la plupart des langages de programmation, 0 est un nombre trop .

8
Vicente Plata

Les nombres de 0 à N ne sont pas N. Ils sont N + 1. Ce n'est pas évident pour la majorité des gens et par conséquent beaucoup de programmes ont des bugs parce que si c'est la raison.

5

C'est parce qu'en informatique, les nombres commencent par 0. Donc, si vous avez, par exemple, 32 lignes d’adresse (232 adressables), ils seront dans la plage [0, 2^32).

2
Yuval Adam

Si vous débutez dans la programmation, je vous suggère de consulter cet article du wiki sur les représentations de nombres signés

Comme Vicente l'a indiqué, la raison pour laquelle vous soustrayez 1 est que 0 est également un nombre inclus. Comme exemple simple, avec 3 bits, vous pouvez représenter les entiers non négatifs suivants

0 : 000
1 : 001
2 : 010
3 : 011
4 : 100
5 : 101
6 : 110
7 : 111

Tout ce qui dépasse cela nécessite plus de 3 chiffres. Par conséquent, le nombre maximum que vous pouvez représenter est 2 ^ 3-1 = 7. Ainsi, vous pouvez étendre cela à n’importe quelle n et dire que vous pouvez exprimer des entiers compris dans la plage [0,2^n -1]. Maintenant, vous pouvez aller lire cet article et comprendre les différentes formes, et représenter des entiers négatifs, etc.

2
abcd

Si je vous demande quelle est la plus grande valeur que vous puissiez insérer dans un nombre à 2 chiffres, diriez-vous que 102 (100) ou 102-1 (99)? Évidemment ce dernier. Il s’ensuit que si je vous demandais quel était le plus grand nombre n- chiffres, c’était 10n-1. Mais pourquoi y a-t-il le "-1"? Tout simplement, parce que nous pouvons représenter 0 dans un nombre à 2 chiffres également sous la forme 00 (mais tout le monde écrit simplement 0).

Remplaçons 10 par une base arbitraire, b. Il en résulte que pour une base donnée, b, le plus grand nombre n- que vous pouvez représenter est bn-1. En utilisant un nombre 32 bits (n = 32) base-2 (b = 2), nous voyons que la plus grande valeur que nous pouvons représenter 232-1.


Une autre façon de penser consiste à utiliser des nombres plus petits. Disons que nous avons un nombre de 1 bit. Voulez-vous me dire que la plus grande valeur que cela puisse représenter est 21 ou 21-1?

2
Cole Johnson

Dans la plupart des langages de programmation entier est une valeur signée (voir complément à deux ). 

Par exemple, dans Java et .NET, l’octet le plus à gauche est réservé au signe: 

  • 0 => nombre positif ou nul 
  • 1 => nombre négatif

Alors la valeur maximale pour 32-bit nombre est limitée par 2^31. Et en ajoutant -1 nous obtenons 2^31 - 1.

Pourquoi -1 apparaît-il?

Regardez un exemple plus simple avec octets non signés (8 bits):

  1  1  1  1  1  1  1  1
128 64 32 16  8  4  2  1  <-- the most right bit cannot represent 2
--- --------------------
128 + 127 = 255 

Comme d'autres gars l'ont souligné, le bit le plus à droite peut avoir une valeur maximale de 1, pas 2, en raison des valeurs 0/1.

Int32.MaxValue = 2147483647 (.NET)
1
Artru

Parce que 0 est également représenté. La quantité de nombres que vous pouvez représenter est bien 2 ^ n avec n bits, mais le nombre maximum est 2 ^ n-1 car vous devez commencer le compte à 0, c'est-à-dire que chaque bit est mis à 0.

Pour 1 bit: 0, 1
Pour 2 bits: 0, 1, 2, 3
Pour 3 bits: 0, 1, 2, 3, 4, 5, 6, 7

Etc.

1
Mel

Pourquoi avons-nous le "moins 1"?

Répondez simplement à la question: Qu'est-ce que la valeur maximale d'un entier de 1 bit ?

Un bit entier ne peut stocker que deux (21) valeurs: 0 et 1. La dernière valeur est 12 = 1 dix

Deux bits entier ne peut stocker que quatre (22) valeurs: 00, 01, 10 et 11. La dernière valeur est 112 = 3 dix

Ainsi, quand integer peut stocker N, la dernière valeur sera N-1 car le comptage commence à partir de zéro .

n bit entier pouvant stocker 2n valeurs. Où le dernier sera 2n-1

Exemple: Un octet peut stocker 28 (256) valeurs. Où le premier est 0 et le dernier est 255

Pourquoi le maximum n'est-il pas juste 2n?

Parce que compter commence à partir de zéro. Regardez la première valeur pour tout entier de n bit.
Par exemple octet: 00000000

Ce serait très déroutant si:
00000001 signifie 2
00000000 signifie 1 

ne serait pas? ;-)

0
Eugen Konkov

Dans le domaine de l'informatique, on commence à compter à partir de 0.

0
Eminem