web-dev-qa-db-fra.com

Quels sont les nombres max et min qu'un type court peut stocker en C?

J'ai du mal à saisir les types de données en C. Je suis en train de lire un livre C et l'un des défis consiste à déterminer le nombre maximum et minimum qu'une short peut stocker.

En utilisant sizeof(short);, je peux voir qu'un court-métrage consomme 2 octets. Cela signifie que c'est 16 bits, ce qui signifie deux nombres puisqu'il faut 8 bits pour stocker la représentation binaire d'un nombre. Par exemple, 9 serait 00111001 qui remplit un bit. Donc, ne serait-il pas 0 à 99 pour non signé, et -9 à 9 signé?

Je sais que je me trompe, mais je ne sais pas pourquoi. Il dit ici le maximum est (-) 32 767 pour signé et 65 535 pour non signé.

int court, 2 octets, 16 bits, -32 768 -> +32 767 Portée (16 Ko)

9
Mohamad

Pensez en décimal pendant une seconde. Si vous ne disposez que de 2 chiffres pour un numéro, cela signifie que vous pouvez y enregistrer du 00 au 99. Si vous avez 4 chiffres, cette plage devient de 0000 à 9999.

Un nombre binaire est similaire à décimal, sauf que les chiffres ne peuvent être que 0 et 1, au lieu de 0, 1, 2, 3, ..., 9.

Si vous avez un numéro comme celui-ci:

01011101

C'est:

0*128 + 1*64 + 0*32 + 1*16 + 1*8 + 1*4 + 0*2 + 1*1 = 93

Comme vous pouvez le constater, vous pouvez stocker des valeurs plus grandes que 9 dans un octet. Dans un nombre non signé de 8 bits, vous pouvez réellement stocker les valeurs de 00000000 à 11111111, ce qui correspond à 255 en décimal.

Dans un nombre de 2 octets, cette plage passe de 00000000 00000000 à 11111111 11111111, soit 65535.

Votre déclaration "il faut 8 bits pour stocker la représentation binaire d'un nombre" revient à dire "il faut 8 chiffres pour stocker la représentation décimale d'un nombre", ce qui n'est pas correct. Par exemple, le numéro 12345678901234567890 comporte plus de 8 chiffres. De la même manière, vous ne pouvez pas insérer all nombres sur 8 bits, mais seulement 256 d'entre eux. C'est pourquoi vous obtenez des nombres de 2 octets (short), de 4 octets (int) et de 8 octets (long long). En vérité, si vous avez besoin d'une plage de nombres encore plus grande, vous devrez utiliser une bibliothèque.

En ce qui concerne les nombres négatifs, dans un ordinateur à complément à 2, ils ne sont que convention pour utiliser la moitié supérieure de la plage en tant que valeurs négatives. Cela signifie que les nombres qui ont un 1 sur le côté gauche sont considérés comme négatifs.

Néanmoins, ces nombres sont congruents modulo 256 (modulo 2^n si n bits) à leur valeur positive comme le nombre le suggère réellement. Par exemple, le nombre 11111111 est 255 s'il n'est pas signé, et -1 s'il est signé, qui sont congruents modulo 256.

16
Shahbaz

Ceci est défini dans <limits.h> , et est SHRT_MIN & SHRT_MAX.

7
Richard J. Ross III

La référence que vous avez lue est correcte. Du moins, pour les implémentations C habituelles où short est 16 bits - ce n'est pas vraiment fixé dans la norme.

16 bits peuvent contenir 2 ^ 16 modèles de bits possibles, soit 65536 possibilités. Les shorts signés vont de -32768 à 32767, les shorts non signés vont de 0 à 65535.

7
Keith Randall

D'autres ont publié de très bonnes solutions pour vous, mais je ne pense pas qu'ils aient suivi votre pensée et expliqué où vous aviez tort. Je vais essayer.

Je peux voir qu'un court-métrage consomme 2 octets. Cela signifie que c'est 16 bits, 

Jusqu'ici, vous avez raison (bien que short ne soit pas garanti d'être long de 2 octets comme int n'est pas garanti d'être 4 - la seule taille garantie en standard (si je me souviens bien) est char qui devrait toujours être large d'un octet).

ce qui signifie deux nombres puisqu'il faut 8 bits pour stocker la représentation binaire d'un nombre.

De là, vous avez commencé à dériver un peu. Il ne faut pas vraiment 8 bits pour stocker un nombre. Selon le nombre, 16, 32 ou 64 bits peuvent être nécessaires pour le stocker. Diviser vos 16 bits en 2 est une erreur. Si ce n’était pas une implémentation spécifique du processeur, nous aurions pu avoir, par exemple, des nombres à 2 bits. Dans ce cas, ces deux bits pourraient stocker des valeurs telles que:

00 - 0 in decimal
01 - 1 in decimal
10 - 2 in decimal
11 - 3 in decimal

Pour stocker 4, nous avons besoin de 3 bits. Et si la valeur "ne correspondait pas" causant un débordement. La même chose s'applique au nombre 16 bits. Par exemple, supposons que le nombre "255" non signé soit stocké sur 16 bits, la représentation binaire serait 0000000011111111. Lorsque vous ajoutez 1 à ce nombre, il devient 0000000100000000 (256 en décimal). Donc, si vous n'aviez que 8 bits, il déborderait et deviendrait 0 car le bit le plus significatif aurait été supprimé.

Maintenant, le nombre maximum non signé que vous pouvez en mémoire 16 bits est - 1111111111111111, ce qui correspond à 65535 en décimal. En d'autres termes, pour les nombres non signés - définissez tous les bits sur 1, ce qui vous donnera la valeur maximale possible.

Pour les nombres signés, cependant, le bit le plus significatif représente un signe - 0 pour le positif et 1 pour le négatif. Pour négatif, la valeur maximale est 1000000000000000, ce qui correspond à -32678 en base 10. Les règles de représentation binaire signée sont bien décrites ici .

J'espère que ça aide!

3
user405725

La formule pour trouver la plage de tout nombre représenté binaire non signé:

2 ^ (sizeof(type)*8)
0
Linuxios