Maison >développement back-end >C++ >Représenter et manipuler des informations dans un ordinateur moderne - Partie 2
Lien vers la partie 1
Un entier de 4 octets dans une machine 32 bits stocke tous ses 4 octets dans une séquence d'octets contiguë. Il peut être stocké de deux manières, à savoir Little endian et Big endian selon la machine. Sans entrer dans les détails, un Little endian stocke un int (4 octets sur 32 bits) de valeur hexadécimale 0x01234567, quelque chose comme suit (en supposant que l'adresse de départ est 0x100) :
Adresses/Valeurs
0x100 67
0x101 45
0x102 23
0x103 01
et de la même manière, un Big endian ressemblera à ceci :
Adresses/Valeurs
0x100 01
0x101 23
0x102 45
0x103 67
J'espère que vous pourrez voir la différence dans la commande. Linux 32 bits, Windows, Linux 64 bits suivent Little endian tandis que SunOS/SPARC suit Big endian.
Ceci est important car lors de l'envoi d'un message sur un réseau depuis une machine de tri d'octets Little endian vers des machines de tri d'octets Big endian et vice versa, cela pourrait être un problème. La plupart des programmeurs ne trouvent pas que c'est un problème car les applications réseau sont écrites de manière à effectuer ces conversions pour nous, mais si vous écrivez une application réseau, vous devrez peut-être en tenir compte.
Vous pourriez être surpris de savoir que l'ajout de deux nombres positifs peut entraîner un nombre négatif et x < y peut vous donner un résultat différent de celui de x - y < 0.
Permettez-moi de vous donner un exemple, disons que nous avons un ordinateur qui stocke un int en 4 bits et que nous avons deux int non signés x et y.
entier non signé x = 10 ; // représentant binaire : 1010
entier non signé y = 15 ; // représentant binaire : 1111
int non signé z = x y ; // ???
La valeur de z est 25. n'est-ce pas ? n'est-ce pas ?
Eh bien non. Si vous convertissez 25 en sa représentation binaire, il s'avère que c'est 11001, mais comme je l'ai mentionné, notre ordinateur ne peut stocker que des entiers de 4 bits (valeurs de 0 à 15 en cas de non signé). Alors, que fera notre ordinateur avec ce bit supplémentaire ? Vous avez raison, cela supprimera le bit d'ordre supérieur (premier bit en partant de la gauche) et nous obtiendrons 1001 qui se convertira en 9. Cela revient à faire un module avec 16, c'est-à-dire 25 mod 16 = 9. Ce comportement de l'ordinateur non limité à l'arthmétique est aussi appelé débordement.
Mais pourquoi j'utilise unsigned int ici ? Cet ajout se comportera-t-il différemment avec des entiers signés ?
Réponse : Oui, mais avant d'expliquer quel sera le résultat et comment notre ordinateur a abouti à cela, comprenons d'abord en quoi les signés et non signés sont différents avec notre entier de 4 bits.
Ils peuvent stocker des valeurs positives et négatives allant de -8 (bin rep : 1000) à 7 (bin rep : 0111). Le bit d'ordre supérieur (premier bit en partant de la gauche) est celui qui donne des valeurs entières négatives signées et le reste des bits donne des valeurs positives. Ainsi, pour obtenir le plus petit nombre, nous devons retourner l'ordre supérieur à 1 et les autres bits à 0 et pour obtenir le plus grand nombre, nous devons retourner le bit d'ordre supérieur à 0 et les autres bits à 1.
Ils ne peuvent stocker que des valeurs de nombres positifs allant de 0 (représentation binaire : 0000) à 15 (représentation binaire : 1111).
Maintenant, comme x=10 et y=15 déborderont avant l'addition, nous utiliserons quelque chose de plus petit :
entier x = 5 ; //0101
entier y = 6 ; //0110
int z = x y // ???
La représentation binaire devrait être 1011 si l'on ignore la contrepartie signée. Comme vous pouvez le voir, le bit d'ordre supérieur est basculé sur 1 et d'en haut, la valeur de z sera -5(= -1*2ˆ3 2ˆ1 2ˆ0) au lieu de 11.
et aussi, ajouter deux négatifs peut entraîner une postivie. par exemple,
int x = -8 // 1000
int y = -5 // 0101
int z = x y // ???
Maintenant, z sera -13, soit 10011 en binaire (le bit d'ordre supérieur est pour les négatifs, c'est-à-dire -1*2ˆ4 = -16) mais notre ordinateur ne peut stocker que 4 bits, il supprimera donc le bit d'ordre supérieur et devient 0011 qui vaut 3 en décimal. Encore une fois, débordement.
C'est pourquoi x < y pourrait résulter différemment de x - y < 0 si l’on ne gère pas correctement les débordements arthmétiques. En tant que programmeur, nous devons toujours faire attention lors du choix des types de données en tenant compte de leurs capacités et de leur comportement dans différentes situations, car ils peuvent résulter d'heures de débogage.
C'est tout pour aujourd'hui. Veuillez commenter si certaines informations ici sont fausses ou manquantes. Merci.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!