378 votes

Si les machines 32 bits ne peuvent traiter que des nombres allant jusqu'à 2^32, pourquoi puis-je écrire 1000000000000 (trillion) sans que ma machine ne se bloque ?

Les ordinateurs 32-bit ne peuvent stocker que des entiers signés jusqu'à 2 31 - 1.
C'est pourquoi nous avons épuisé les adresses IPv4 et sommes entrés dans l'ère des 64 bits.

Cependant, le numéro 2 31 - 1 (2 147 483 647) n'est pas aussi grand que le nombre 1 trillion (1 000 000 000 000) que je semble pouvoir afficher sans que ma machine ne se bloque.

Quelqu'un peut-il expliquer pourquoi ?

36 votes

La question est erronée. Les machines 32 bits peuvent gérer des nombres bien plus grands que 2^32. Elles le font tout le temps, avec 'long' et ainsi de suite. Elles ne peuvent stocker que jusqu'à 2^32 dans un registre, mais le logiciel est écrit pour contourner ce problème. Certains langages modernes n'ont même pas de problème avec la longueur d'un nombre donné.

23 votes

Veuillez garder vos commentaires sur le sujet, polis et pertinents pour les aspects techniques de la question. Près de 50 commentaires de blagues ont déjà dû être supprimés, et nous aimerions éviter de devoir verrouiller le poste. Merci.

6 votes

Cette question a été rédigée d'une manière un peu négligée. Que voulez-vous dire par "écrire" et "afficher" le nombre 1000000000000 ? Lorsque vous avez rédigé la question, vous avez écrit le nombre 1000000000000, et votre navigateur Web l'affiche très bien, je suppose, mais cela ne devrait rien avoir d'étrange pour quiconque a déjà utilisé un ordinateur. La question demande une libre interprétation.

24voto

user1306322 Points 4486

Tout est dans votre question.

Vous pouvez écrire le nombre que vous voulez sur le papier. Essayez d'écrire un trillion de points sur une feuille de papier blanc. C'est lent et inefficace. C'est pourquoi nous avons un système à 10 chiffres pour représenter ces grands nombres. Nous avons même des noms pour les grands nombres, comme "million", "trillion" et autres, afin d'éviter que vous disiez one one one one one one one one one one one... à voix haute.

Les processeurs 32 bits sont conçus pour travailler plus rapidement et plus efficacement avec des blocs de mémoire d'une longueur de 32 chiffres binaires exactement. Mais nous, les gens, utilisons couramment un système numérique à 10 chiffres, et les ordinateurs, étant électroniques, utilisent un système à 2 chiffres ( binaire ). Il se trouve que les nombres 32 et 64 sont des puissances de 2, tout comme un million et un trillion sont des puissances de 10. Il est plus facile pour nous d'opérer avec ces nombres qu'avec des multitudes de 65536, par exemple.

Nous décomposons les grands nombres en chiffres lorsque nous les écrivons sur papier. Les ordinateurs décomposent les nombres en un plus grand nombre de chiffres. Nous pouvons écrire n'importe quel nombre que nous voulons, et les ordinateurs peuvent en faire autant si nous les concevons ainsi.

15voto

Charlie Points 4976

32bit et 64bit font référence aux adresses mémoire. La mémoire de votre ordinateur est comme des boîtes postales, chacune ayant une adresse différente. L'unité centrale de traitement (UC) utilise ces adresses pour adresser les emplacements mémoire de votre RAM (mémoire vive). Lorsque l'unité centrale ne pouvait gérer que des adresses de 16 bits, vous ne pouviez utiliser que 32 mégaoctets de RAM (ce qui semblait énorme à l'époque). Avec le 32 bits, on est passé à 4+gb (ce qui semblait énorme à l'époque). Maintenant que nous disposons d'adresses de 64 bits, la RAM atteint les téraoctets (ce qui semble énorme).
Cependant, le programme est capable d'allouer plusieurs blocs de mémoire pour des choses comme le stockage de chiffres et de texte, cela dépend du programme et n'est pas lié à la taille de chaque adresse. Ainsi, un programme peut dire à l'unité centrale : "Je vais utiliser 10 blocs d'adresses de stockage et stocker un très grand nombre, ou une chaîne de 10 lettres, etc.
Remarque : les adresses de mémoire sont indiquées par des "pointeurs". Les valeurs de 32 et 64 bits correspondent donc à la taille du pointeur utilisé pour accéder à la mémoire.

2 votes

Bonne réponse sauf pour les détails - 16bits d'espace d'adressage vous donnaient 64kb, pas 32mb, et des machines comme le 286 avaient des adresses de 24 bits (pour 16mb). De plus, avec des adresses de 64 bits, vous allez bien au-delà des téraoctets - plutôt 16 exaoctets - les téraoctets correspondent au type de limites imposées par les cartes mères/unités centrales de la génération actuelle - et non à la taille des adresses.

4 votes

Le 32 bits fait référence à la taille des mots de la machine, et non aux adresses mémoire. Comme Phil l'a mentionné, le 286 était un processeur 16 bits mais utilisait 24 bits pour l'adressage par segmentation de la mémoire. Les processeurs x86 sont 32 bits, mais utilisent un adressage 36 bits. Voir PAE .

0 votes

@gronostaj bien x86 sont ont 32-bit adressant de 386 à Pentium.

13voto

noob Points 1109

Parce que l'affichage du nombre se fait à l'aide de caractères individuels, et non d'entiers. Chaque chiffre du nombre est représenté par un caractère littéral distinct, dont la valeur entière est définie par l'encodage utilisé, par exemple 'a' est représenté par la valeur ascii 97 alors que '1' est représenté par 49 . Vérifiez le tableau ascii ici .
Pour l'affichage, "a" et "1" sont identiques. Il s'agit de caractères littéraux et non d'entiers. Chaque caractère littéral est autorisé à avoir une valeur maximale de 255 sur une plate-forme 32 bits, en stockant la valeur dans une taille de 8 bits ou de 1 octet (cela dépend de la plate-forme, mais 8 bits est la taille de caractère la plus courante), ils peuvent donc être regroupés et affichés. Le nombre de caractères séparés qu'ils peuvent afficher dépend de la RAM dont vous disposez. Si vous avez seulement 1 octet de RAM, vous pouvez afficher un seul caractère, si vous avez 1 Go de RAM, vous pouvez afficher 1024*1024*1024 caractères (j'ai la flemme de faire le calcul).

Cette limitation s'applique toutefois aux calculs, mais je suppose que vous vous intéressez à la norme IPV4. Bien qu'elle ne soit pas entièrement liée aux ordinateurs bit-size cela a en quelque sorte affecté les normes. Lorsque la norme IPV4 a été créée, les valeurs IP étaient stockées dans des entiers de 32 bits. Maintenant, une fois que vous avez donné la taille, et il est devenu standard. Tout ce que nous connaissons d'internet dépendait de cela, et ensuite nous avons manqué d'adresses IP à attribuer. Donc si la norme IP était révisée pour avoir 64 bits, tout cesserait de fonctionner, y compris votre routeur (je suppose que c'est correct) et les autres périphériques de réseau. Une nouvelle norme doit donc être créée, qui remplace simplement les entiers de 32 bits par des entiers de 128 bits. Et le reste de la norme a été ajusté. Les fabricants de matériel informatique n'ont qu'à déclarer qu'ils supportent cette nouvelle norme et elle deviendra virale. Bien que ce ne soit pas aussi simple, mais je pense que vous avez compris l'essentiel.

Avis de non-responsabilité : La plupart des points mentionnés ici sont vrais à mon avis. J'ai peut-être omis des points importants pour simplifier les choses. Je ne suis pas doué avec les chiffres, donc j'ai dû oublier quelques chiffres, mais mon but est de répondre à la réponse de l'OP sur la raison pour laquelle il ne plantera pas le PC.

2 votes

Je n'ai pas rétrogradé, mais il y a un certain nombre de problèmes avec votre réponse. 1 est 0x31 en ASCII, pas 0x1. 1 GB = 1024^3 B. IPv4 a été inventé avant l'introduction des CPU 32 bits, donc dire que les adresses étaient stockées dans des entiers 32 bits est en conflit avec la question du PO. Et enfin, IPv6 utilise des adresses de 128 bits, et non de 64 bits.

13voto

Damn Vegetables Points 181

Dans les processeurs, il y a des "mots". Il y a différents mots. Quand les gens disent "processeur 32 bits", ils veulent surtout dire "largeur du bus mémoire". Ce mot est composé de différents "champs", qui font référence aux sous-systèmes de l'ordinateur correspondant à la transmission (24 bits) et au contrôle (autres bits). Je peux me tromper sur les chiffres exacts, assurez-vous d'en être sûr en consultant les manuels.

Le calcul est un aspect complètement différent. Les jeux d'instructions SSE et MMX peuvent stocker de longs entiers. La longueur maximale sans perte de productivité dépend de la version actuelle de SSE mais c'est toujours un multiple de 64bits.

Les processeurs Opteron actuels peuvent gérer des nombres d'une largeur de 256 bits (je ne suis pas sûr pour les nombres entiers, mais les nombres flottants sont certains).

Résumé : (1) la largeur du bus n'est pas directement liée à la largeur de calcul, (2) même les différents mots (mot de mémoire, mot de registre, mot de bus, etc.) ne sont pas liés les uns aux autres, sinon qu'ils ont un diviseur commun d'environ 8, 16 ou 24. De nombreux processeurs utilisaient même des mots de 6 bits (mais c'est de l'histoire ancienne).

0 votes

C'est faux, le processeur Pentium original avait un bus de données de 64 bits pour une bande passante mémoire élevée, même si c'était un processeur 32 bits. Le 8088 était un processeur 16 bits avec un bus de données 8 bits.

10voto

Brian Ensink Points 7579

L'objectif d'un dispositif informatique, en général, est d'accepter, de traiter, de stocker et d'émettre des données. Le matériel sous-jacent n'est qu'une machine qui aide à exécuter ces quatre fonctions. Il ne peut rien faire sans logiciel.

Le logiciel est le code qui indique à la machine comment accepter des données, comment les traiter, comment les stocker et comment les fournir à d'autres.

Le matériel sous-jacent aura toujours des limites. Dans le cas d'une machine 32 bits, la plupart des registres qui traitent les données n'ont qu'une largeur de 32 bits. Cela ne signifie pas pour autant que la machine ne peut pas traiter des nombres au-delà de 2^32, mais que si vous voulez traiter des nombres plus grands, la machine peut prendre plus d'un cycle pour les accepter, les traiter, les stocker ou les émettre.

Le logiciel indique à la machine comment traiter les chiffres. Si le logiciel est conçu pour traiter de grands nombres, il envoie une série d'instructions à l'unité centrale qui lui indiquent comment traiter les grands nombres. Par exemple, votre nombre peut être représenté par deux registres de 32 bits. Si vous vouliez ajouter 1 234 à votre nombre, le logiciel demanderait à l'unité centrale d'ajouter d'abord 1 234 au registre inférieur, puis de vérifier le bit de dépassement pour voir si cette addition a donné un nombre trop grand pour le registre inférieur. Si c'est le cas, il ajoute 1 au registre supérieur.

De la même manière que l'on apprend aux enfants de l'école primaire à additionner avec retenue, on peut demander à l'unité centrale de traiter des nombres plus grands que ceux qu'elle peut contenir dans un seul registre. Ceci est vrai pour la plupart des opérations mathématiques génériques, pour des nombres de toute taille pratique.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X