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?
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).
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 ...
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.
Dans la plupart des langages de programmation, 0
est un nombre trop .
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.
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)
.
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.
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?
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égatifAlors 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)
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.
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 2
n
valeurs. Où le dernier sera 2
n-1
Exemple: Un octet peut stocker 2
8 (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? ;-)
Dans le domaine de l'informatique, on commence à compter à partir de 0.