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.

10voto

La différence réside dans la manière dont nous stockons les données dans les ordinateurs.

Vous avez raison de dire que pour une machine théorique de 8 bits, nous ne sommes capables de stocker que 2^8 valeurs dans un seul registre du processeur ou une seule adresse mémoire. (Veuillez garder à l'esprit que cela varie d'une "machine" à l'autre en fonction du processeur utilisé, de l'architecture de la mémoire, etc. Mais pour l'instant, restons-en à une hypothétique machine "stéréotype").

Pour une machine théorique de 16 bits, la valeur maximale dans un registre/emplacement mémoire serait de 2^16, pour une machine de 32 bits, 2^32, etc.

Au fil des ans, les programmeurs ont imaginé toutes sortes de subterfuges pour stocker et manipuler des nombres supérieurs à ceux qui peuvent être stockés dans un seul registre du processeur ou une seule adresse mémoire. Il existe de nombreuses méthodes, mais elles impliquent toutes l'utilisation de plus d'un registre/adresse mémoire pour stocker des valeurs plus grandes que la largeur de leur registre/emplacement mémoire "natif".

Toutes ces méthodes ont pour avantage de permettre à la machine de stocker/traiter des valeurs supérieures à leur capacité native. L'inconvénient est que presque toutes les approches nécessitent de multiples instructions/lectures/etc. de la machine pour traiter ces nombres. Pour les grands nombres occasionnels, ce n'est pas un problème. Lorsqu'il s'agit de lots de grands nombres (en particulier les grandes adresses mémoire), les frais généraux impliqués ralentissent les choses.

D'où le désir général de rendre les registres, les emplacements de mémoire et le matériel d'adressage de la mémoire de plus en plus "larges" afin de traiter les grands nombres "nativement", de manière à ce que ces nombres puissent être traités avec le nombre minimum d'opérations.

La taille des nombres étant infinie, la taille/adressage des registres/mémoire du processeur est toujours un équilibre entre la taille native des nombres et les coûts liés à la mise en œuvre de largeurs de plus en plus grandes.

8voto

Jimmy Points 239

Les ordinateurs 32 bits ne peuvent stocker que des nombres allant jusqu'à 2^32 dans un seul mot machine, mais cela ne signifie pas qu'ils ne peuvent pas gérer des entités de données plus importantes.

La signification d'un ordinateur 32 bits est généralement que le bus de données et le bus d'adresse ont une largeur de 32 bits, ce qui signifie que l'ordinateur peut gérer 4 Go d'espace d'adresse mémoire à la fois, et envoyer quatre octets de données à la fois sur le bus de données.

Cela n'empêche cependant pas l'ordinateur de traiter davantage de données, il doit simplement diviser les données en morceaux de quatre octets lorsqu'elles sont envoyées sur le bus de données.

Le processeur Intel 32 bits ordinaire peut gérer des nombres de 128 bits en interne, ce qui vous permettrait de traiter des nombres tels que 100000000000000000000000000000000000000 sans aucun problème.

Il est possible de traiter des nombres bien plus grands que cela dans un ordinateur, mais les calculs doivent alors être effectués par un logiciel, l'unité centrale n'ayant pas d'instructions pour traiter des nombres supérieurs à 128 bits. (Il peut manipuler des nombres beaucoup plus grands sous la forme de nombres à virgule flottante, mais vous n'avez alors que 15 chiffres de précision).

6voto

urini Points 8233

J'ajoute juste une note aux nombreuses autres réponses, parce que c'est un fait assez important dans cette question qui a été oublié.

"32 bits" fait référence à la largeur de l'adresse mémoire. Cela n'a rien à voir avec la taille du registre. De nombreux processeurs 32 bits ont probablement des registres de 64 ou même 128 bits. En ce qui concerne plus particulièrement la gamme de produits x86, les récents processeurs grand public, qui sont tous à 64 bits, possèdent jusqu'à 256 bits de registres à des fins spéciales.

Cette différence entre la largeur du registre et la largeur de l'adresse existe depuis des temps anciens, lorsque nous avions des registres de 4 bits et des adresses de 8 bits, ou vice versa.

Il est simple de voir que le stockage d'un grand nombre ne pose aucun problème, quelle que soit la taille du registre, comme expliqué dans d'autres réponses.

La raison pour laquelle les registres, quelle que soit leur taille, peuvent en outre calculer avec des nombres plus grands, c'est que les calculs trop importants peuvent être décomposés en plusieurs petits calculs qui tiennent dans les registres (c'est juste un tout petit peu plus compliqué en réalité).

0 votes

Ce n'est pas vraiment vrai ; ce à quoi se réfère le 64 bits est incohérent, mais les systèmes dont la largeur de registre est de 64 bits sont fréquemment appelés 64 bits. Selon Wikipedia, "une architecture informatique 64 bits possède généralement des registres entiers et d'adressage d'une largeur de 64 bits". Oui, la gamme moderne de produits x86 (ou AMD-64) possède d'énormes registres à usage spécial, mais ils ont des registres principaux de 64 bits et peuvent accéder à 48-52 bits de mémoire ; les anciens systèmes x86 ont des registres principaux de 32 bits et accèdent à 24-36 bits de mémoire, et le 8086 était appelé une puce de 16 bits, avait des registres de 16 bits de large et accédait à 20 bits de mémoire.

0 votes

@prosfilaes C'est beaucoup d'informations précieuses, j'y faisais référence (je n'ai pas réussi à me souvenir des détails aussi bien que vous). N'hésitez pas à modifier ces informations dans la réponse.

6voto

Kyle Strand Points 1506

Les réponses déjà données sont en fait assez bonnes, mais elles ont tendance à aborder la question sous différents angles et présentent donc une image incomplète. Elles sont également un peu trop techniques, à mon avis.

Donc, juste pour clarifier quelque chose qui a été suggéré mais pas explicitement exprimé dans les autres réponses, et qui je pense est le point crucial de la question :

Vous mélangez plusieurs concepts dans votre question. et l'un d'entre eux ("32 bits") peut en fait se référer à une variété de choses différentes (et différentes réponses ont supposé différentes interprétations). Ces concepts ont tous quelque chose à voir avec le nombre de bits (1 et 0) utilisés (ou disponibles) dans divers contextes informatiques (ce que j'entends par là sera, je l'espère, clarifié par les exemples ci-dessous), mais les concepts sont les suivants sans autre lien .

Explicitement :

  • "IPv4/6" fait référence à protocole internet un ensemble de règles définissant la manière dont l'information doit être présentée et interprétée sur l'internet. La principale (ou du moins la plus connue) distinction entre IPv4 et IPv6 est que l'IPv4 n'est pas un protocole de communication. espace adresse (c'est-à-dire l'ensemble des adresses qui peuvent être utilisées pour distinguer les différents emplacements sur le réseau) est plus grande dans l'IPv6. Cela est dû au fait que le nombre de bits de chaque paquet de données envoyé sur le réseau est plus élevé que le nombre d'adresses. alloué pour (c'est-à-dire mis de côté dans le but d') identifier l'expéditeur et le destinataire du paquet.
    • Analogie non informatique : Chaque paquet est comme une lettre envoyée par courrier postal, et l'espace d'adressage est comme le nombre de caractères que vous êtes "autorisé" à utiliser pour écrire l'adresse et l'adresse de retour sur l'enveloppe.
    • Je ne vois pas que cela soit mentionné dans les autres réponses jusqu'à présent.
  • Les "mots" de la mémoire d'un ordinateur (32 et 64 bits) peuvent généralement être considérés comme le plus petit élément de données qu'un ordinateur utilise, ou dans lequel il "pense". Ces bits de données s'assemblent pour former d'autres bits de données, comme des morceaux de texte ou des entiers plus grands.
  • 32 bits pointeurs peuvent être ou non des mots, mais ils sont néanmoins traités de manière atomique (c'est-à-dire comme des unités individuelles qui ne peuvent pas être décomposées en composants plus petits). Les pointeurs sont le moyen le plus bas par lequel un ordinateur peut enregistrer l'emplacement en mémoire d'un morceau arbitraire de données. Notez que la taille du pointeur utilisée par l'ordinateur (ou, en réalité, par le système d'exploitation) limite la plage de mémoire à laquelle un pointeur unique peut accéder, car il n'y a qu'autant d'emplacements mémoire possibles vers lesquels un pointeur peut "pointer" qu'il y a de valeurs possibles pour le pointeur lui-même. Cela est analogue à la manière dont l'IPv4 limite la gamme d'adresses Internet possibles, mais ne limite pas le nombre de valeurs possibles pour le pointeur lui-même. no limiter la quantité de données qui peuvent être présentes, par exemple, dans une page web particulière. Cependant, la taille du pointeur ne no limiter la taille des données elles-mêmes vers lesquelles le pointeur peut pointer. (Pour un exemple de schéma permettant à la taille des données d'excéder la portée du pointeur, consultez le fichier structure de pointeur d'inode . Notez qu'il s'agit d'une utilisation légèrement différente du mot "pointeur" par rapport à l'usage habituel, puisque le terme "pointeur" fait généralement référence à un pointeur dans la mémoire vive, et non dans l'espace du disque dur).
    • Analogie non informatique : hmmmm.... celle-ci est un peu délicate. Peut-être que le système décimal de Dewey pour l'indexation des documents de bibliothèque est un peu similaire ? Ou tout autre système d'indexation, en fait.
    • Voir Réponse de SiteNook .
    • Veuillez noter que mon explication des pointeurs ci-dessus élude certains détails subtils et n'est sans doute pas entièrement correcte. Cependant, dans les langages de programmation dans lesquels les programmeurs travaillent directement avec des pointeurs, le mode mental que j'ai dessiné est généralement suffisant à des fins pratiques.
  • El les chiffres qu'un ordinateur est "capable d'afficher". ne sont pas (à des fins pratiques) limités par le matériel ou le système d'exploitation de l'ordinateur ; ils sont traités comme n'importe quel autre texte.

Notez qu'il ne s'agit pas d'une liste exhaustive des interprétations de l'expression "32 bits".

Crédit supplémentaire : pour bien comprendre la distinction philosophique fondamentale entre les nombres et les parties primitives de la mémoire des ordinateurs, lisez un peu l'ouvrage suivant Machines de Turing .

0 votes

Je pense que la référence à IPv4 visait à souligner que le nombre d'adresses IPv4 est effectivement limité à la longueur d'un entier signé de 32 bits, alors qu'IPv6 utilise 128 bits et peut donc avoir plusieurs ordres de grandeur d'adresses.

0 votes

@Clonkex C'est possible, bien que ce ne soit pas la question qui soit formulée ainsi.

5voto

Dee Points 240

Si vous écrivez 1000000000000 par exemple dans une calculatrice, l'ordinateur le calculera comme un Type réel numéro avec point décimal . La limite pour 32 bits que vous avez mentionnée touche plus tout le monde. Type d'entier des chiffres sans point décimal. Les différents types de données utilisent différentes méthodes pour obtenir des bits/octets.

Numéros de type entier : Ce tableau pourrait vous aider à saisir l'essentiel ( http://msdn.microsoft.com/en-us/library/296az74e.aspx ). Cela touche les limites du C++. Par exemple Numéro de type Int64 a des limites allant de -9223372036854775808 à 9223372036854775807.

Numéros de type réel : Les nombres de type réel contiennent une valeur avec virgule flottante y exposant et vous pouvez saisir des nombres beaucoup plus grands, mais avec une exactitude/précision limitée. ( http://msdn.microsoft.com/en-us/library/6bs3y5ya.aspx ) Par exemple, le LDBL (grand double) en C++ a un exposant maximum de 308, donc vous pouvez éventuellement entrer ou avoir comme résultat un nombre 9.999 x 10^308 ce qui signifie que vous aurez théoriquement 308(+1) chiffres de 9 mais seuls les 15 chiffres les plus importants seront utilisés pour le représenter, le reste sera perdu, en raison de la précision limitée.

En outre, il existe différents langages de programmation et ils pourraient avoir des implémentations différentes des limites de nombre. Vous pouvez donc imaginer que des applications spécialisées puissent gérer des nombres beaucoup plus grands (et/ou plus exacts/précis) que le C++.

0 votes

Cette "réponse" est incorrecte : les calculatrices utilisent la représentation des nombres en BCD afin d'éviter les erreurs de troncature. C'est-à-dire que 0,1 décimal ne peut pas être représenté correctement comme un nombre binaire de longueur finie.

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