La majeure partie du contenu de cette réponse provient à l'origine de cette réponse (écrit avant que cette autre question ne soit marquée comme un doublon). Je parle donc de l'utilisation de valeurs sur 8 bits (même si la question portait sur les valeurs sur 32 bits), mais ce n'est pas grave car les valeurs sur 8 bits sont plus simples à comprendre sur le plan conceptuel, et les mêmes concepts s'appliquent à des valeurs plus grandes comme l'arithmétique sur 32 bits.
Lorsque vous additionnez deux nombres à 8 bits, le plus grand nombre que vous pouvez obtenir (0xFF + 0xFF = 1FE). En fait, si vous multipliez deux nombres de 8 bits, le plus grand nombre que vous pouvez obtenir (0xFF * 0xFF = 0xFE01) est toujours de 16 bits, soit le double de 8 bits.
Vous supposez peut-être qu'un processeur à x bits ne peut garder la trace que de x bits. (Par exemple, un processeur 8 bits ne peut conserver que 8 bits.) Ce n'est pas exact. Le processeur 8 bits reçoit les données par morceaux de 8 bits. (Ces "morceaux" ont généralement un terme officiel : un "mot". Sur un processeur 8 bits, on utilise des mots de 8 bits. Sur un processeur 64 bits, on peut utiliser des mots de 64 bits).
Donc, quand vous donnez 3 octets à l'ordinateur :
Octet 1 : l'instruction MUL
Octet n° 2 : les octets de poids fort (par exemple, 0xA5).
Octet n° 3 : les octets d'ordre inférieur (par exemple, 0xCB)
L'ordinateur peut générer un résultat de plus de 8 bits. L'ordinateur peut générer des résultats comme celui-ci :
0100 0000 0100 0010 xxxx xxxx xxxx xxxx xxxx 1101 0111
alias :
0x4082xxxxD7
Maintenant, laissez-moi interpréter ça pour vous :
0x signifie simplement que les chiffres suivants sont hexadécimaux.
Je parlerai plus en détail de la "40" dans un instant.
82 fait partie du registre "A", qui est une série de 8 bits.
xx et xx font partie de deux autres registres, appelés registre "B" et registre "C". La raison pour laquelle je n'ai pas rempli ces bits avec des zéros ou des uns est qu'une instruction "ADD" (envoyée au CPU) peut faire en sorte que ces bits ne soient pas modifiés par l'instruction (alors que la plupart des autres bits que j'utilise dans cet exemple peuvent être modifiés, à l'exception de certains des bits de drapeau).
D7 tiendrait dans plus de bits, appelés le registre "D".
Un registre n'est qu'un morceau de mémoire. Les registres sont intégrés aux processeurs, de sorte que le processeur peut accéder aux registres sans avoir besoin d'interagir avec la mémoire d'une clé RAM.
Le résultat mathématique de 0xA5 fois 0xCB est donc 0x82D7.
Maintenant, pourquoi les bits ont-ils été répartis dans les registres A et D au lieu des registres A et B, ou des registres C et D ? Eh bien, une fois de plus, il s'agit d'un exemple de scénario que j'utilise et qui est censé être assez similaire à un véritable langage Assembleur (Intel x86 16 bits, tel qu'utilisé par les Intel 8080 et 8088 et de nombreux CPU plus récents). Il peut y avoir quelques règles communes, comme le registre "C" utilisé typiquement comme index pour les opérations de comptage (boucle for), et le registre "B" utilisé pour garder la trace des offsets qui aident à spécifier les emplacements mémoire. Ainsi, "A" et "D" peuvent être plus courants pour certaines des fonctions arithmétiques courantes.
Chaque instruction du CPU devrait avoir une documentation, utilisée par les personnes qui programment en Assembleur. Cette documentation devrait spécifier quels registres sont utilisés par chaque instruction. (Ainsi, le choix des registres à utiliser est souvent spécifié par les concepteurs de l'unité centrale, et non par les programmeurs en langage Assembleur. Bien qu'il puisse y avoir une certaine flexibilité).
Revenons maintenant au "40" de l'exemple ci-dessus : il s'agit d'une série de bits, souvent appelée "registre des drapeaux". Chaque bit du registre des drapeaux a un nom. Par exemple, il y a un bit "overflow" que le CPU peut activer si le résultat est plus grand que l'espace qui peut stocker un octet des résultats. (Le bit "overflow" est souvent désigné par le nom abrégé de "OF". Il s'agit d'un o majuscule et non d'un zéro). Les logiciels peuvent vérifier la valeur de cet indicateur et remarquer le "problème". L'utilisation de ce bit est souvent gérée de manière invisible par les langages de haut niveau, de sorte que les programmeurs débutants n'apprennent souvent pas à interagir avec les drapeaux du CPU. Cependant, les programmeurs en Assembleur peuvent couramment accéder à certains de ces drapeaux d'une manière très similaire aux autres variables.
Par exemple, vous pouvez avoir plusieurs instructions ADD. Une instruction ADD peut stocker 16 bits de résultats dans le registre A et le registre D, tandis qu'une autre instruction peut simplement stocker les 8 bits de poids faible dans le registre A, ignorer le registre D et spécifier le bit de débordement. Ensuite, plus tard (après avoir stocké les résultats du registre A dans la RAM principale), vous pourriez utiliser une autre instruction ADD qui stocke uniquement les 8 bits de poids fort dans un registre (peut-être le registre A).
(Il existe aussi couramment un drapeau "underflow", au cas où vous soustrayez trop de choses pour obtenir le résultat souhaité).
Juste pour vous montrer à quel point les choses se sont compliquées :
L'Intel 4004 était un processeur 4 bits
L'Intel 8008 était un processeur 8 bits. Il avait des registres de 8 bits nommés A, B, C et D.
L'Intel 8086 était un processeur 16 bits. Il possédait des registres de 16 bits nommés AX, BX, CX et DX.
L'Intel 80386 était un processeur 32 bits. Il possédait des registres 32 bits nommés EAX, EBX, ECX et EDX.
Les processeurs Intel x64 possèdent des registres 64 bits appelés RAX, RBX, RCX et RDX. Les puces x64 peuvent exécuter du code 16 bits (dans certains modes de fonctionnement) et interpréter des instructions 16 bits. Ce faisant, les bits qui composent le registre AX sont la moitié des bits qui composent le registre EAX, qui sont la moitié des bits qui composent le registre RAX. Ainsi, chaque fois que vous modifiez la valeur de AX, vous modifiez également EAX et RAX, car les bits utilisés par AX font partie des bits utilisés par RAX. (Si vous modifiez EAX par une valeur qui est un multiple de 65 536, les 16 bits de poids faible restent inchangés et AX ne change pas. Si vous modifiez EAX par une valeur qui n'est pas un multiple de 65 536, alors cela affectera également AX).
Il y a plus de drapeaux et de registres que ceux que j'ai mentionnés. J'ai simplement choisi ceux qui sont les plus utilisés afin de fournir un exemple conceptuel simple.
Si vous utilisez un processeur de 8 bits, lorsque vous écrivez dans la mémoire, il se peut que vous trouviez certaines restrictions quant à la possibilité de vous référer à une adresse de 8 bits, et non à une adresse de 4 bits ou de 16 bits. Les détails varient en fonction de l'UC, mais si vous avez de telles restrictions, alors l'UC peut traiter des mots de 8 bits, c'est pourquoi l'UC est le plus souvent appelée "UC 8 bits".
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.
0 votes
Certains langages (comme Python) peuvent stocker des nombres vraiment très grands sous la forme d'un tableau de chiffres. Avec cela, peu importe la taille de votre mot ou registre, vous pouvez avoir autant de chiffres que vous pouvez en stocker en mémoire. C'est 10^2^32 pour les machines 32 bits ou 10^2^64 pour les machines 64 bits !
10 votes
On estime que la conscience humaine contient environ 50 bits (j'ai lu quelque part). La question n'est donc pas "Comment puis-je écrire" mais "Comment puis-je écrire".
10^9
sans que mon PC ne tombe en panne", mais plutôt "Comment puis-je écrire10^(18)
sans que mon cerveau ne s'effondre ?"1 votes
Les ordinateurs 32 bits ne peuvent stocker que des entiers UNSIGNED jusqu'à 2^32 - 1. 2^32 - 1 n'est même pas égal à 2 147 483 647... 300 votes positifs et personne ne s'en est rendu compte ?
0 votes
@KorayTugay Ça, ou tous ceux qui s'en sont rendu compte ont aussi réalisé que ce n'est pas particulièrement important pour la question.
0 votes
Aussi, ce n'est pas un trillion, c'est 4 milliards
0 votes
A titre d'information :
10^12
s'appelleTrillion
aux États-Unis, au Canada anglais, en Australie et dans les pays britanniques modernes.Billion
en Europe, plus anciens, britanniques et canadiens français.