Explication super détaillée du stockage de données en langage C entier et en virgule flottante


Nous savons tous que le langage C a de nombreux types de données, tels que char, int, double, etc. Dans ce blog, nous allons trier ces types de données. Tout d'abord, nous pouvons diviser les types de données en deux types, entier et virgule flottante (également de type réel) deux catégories, certains lecteurs peuvent être confus, le caractère n'est-il pas un type de caractère? Pourquoi n'est-il pas répertorié? Ne vous inquiétez pas, continuez à lire, l'explication sera donnée ci-dessous.

Entier

Le type entier contient:
char - la taille est de 1 octet
[signé] char
unsigned char
short - la taille est de 2 octets
[signé] court [int]
unsigned short [int]
int - la taille est de 4 octets
[signé] int
unsigned int
long - Le spécial la taille est de 4/8 octets. La taille spécifique est liée au compilateur.
[signé] long
unsigned long [int]
long long - La taille est de 8 octets
[signé] long long
unsigned long long [int]

Non signé représente un nombre non signé et le bit le plus élevé représente également des données, c'est-à-dire que tous les bits sont des bits de données valides. Le contenu entre crochets peut être omis et l’omission n’a aucun effet.
Pourquoi mettre le type de caractère ici, car le langage C utilise le codage ASCII, et chaque caractère correspond à une valeur de code ASCII, et chaque valeur de code ASCII correspond à une valeur entière (le code ASCII est affiché sous Table, le blogueur l'a trouvé sur Baidu ), de sorte que la forme de stockage du type de caractère est en fait la même que celle du type entier. Par exemple, a et 97 (la valeur de code ASCII de a est 97), regardez l'image ci-dessous, de sorte que le blogueur affiche Le char (caractère type) est mis dans le type entier. Pouvez-vous le comprendre maintenant?Insérez la description de l'image ici

Insérez la description de l'image ici
Alors, quelle est exactement la forme de stockage des données entières? La réponse est stockée sous forme de complément à 2. Le binaire doit être connu de tous, alors quel est le complément? Alors pourquoi le concept de code complémentaire apparaît-il?
L'ordinateur stocke les données sous forme de complément et stipule que l'original, l'inversion et le complément d'entiers positifs sont les mêmes, et la relation entre l'original, l'inversion et le complément d'entiers négatifs est que tous les bits du code d'origine sauf le bit de signe est inversé en tant que code inversé Le code plus 1 est le code complémentaire. L'inversion signifie que 0 devient 1 et 1 devient 0 en binaire. Un exemple simple est la représentation binaire de 10 et -10. Prenons int comme exemple:

00000000000000000000000000001010 - Code d'origine (10)
00000000000000000000000000001010 - Code inverse
00000000000000000000000000001010 - Code complémentaire

10000000000000000000000000001010 - code original (-10)
11111111111111111111111111110101 - code inverse
11111111111111111111111111110110 - code complémentaire

Le concept de code de complément apparaît parce que le bit de signe et le champ de valeur peuvent être traités uniformément à l'aide du code de complément; en même temps, l'addition et la soustraction peuvent également être traitées de manière uniforme (le processeur n'a qu'un additionneur), et les amis intéressés peuvent en apprendre davantage. par Baidu.
Lors de la visualisation des données dans la mémoire, elles sont affichées en hexadécimal, et le compilateur utilisé par le blogueur est vs2019, qui appartient au mode de stockage little- endian (simplement compris comme stocker les données à l'envers), donc il est en fait vu dans le la mémoire 10 doit être 0a 00 00 00 au lieu de 00 00 00 0a directement traduit, et -10 doit être f6 ff ff ff L'
Insérez la description de l'image ici
image ci-dessus est tirée de "C Traps and Defects" qui introduit le mode de stockage
. nous l'avons dit sur le code, nous
Insérez la description de l'image ici
Insérez la description de l'image ici
Insérez la description de l'image ici
pouvons voir que le résultat est le même que nous le pensons, donc l'entier est stocké sous la forme d'un complément à deux, et le reste des formes peut être testé par eux-mêmes. Ensuite, nous parlons de flottant point.

Virgule flottante (type réel)

Les types à virgule flottante incluent
float - la taille simple précision est de 4 octets
double - la taille double précision est
longue de 8 octets double - la taille de type virgule flottante double précision longue est de 8 octets

Alors, quelle est la différence entre la forme de stockage de virgule flottante et d'entier? Il n'y a pas de concept de complément en virgule flottante.
Selon la norme internationale IEEE (Institute of Electrical and Electronic Engineering) 754, tout nombre binaire à virgule flottante V peut être exprimé sous la forme suivante:
V = (- 1) ^ S * M * 2 ^ E
(-1) ^ s représente le signe, lorsque s = 0, V est un nombre positif; lorsque s = 1, V est un nombre négatif.
M représente un nombre significatif, supérieur ou égal à 1 et inférieur à 2.
2 ^ E représente le bit d'exposant.

Insérez la description de l'image ici
Insérez la description de l'image ici
Lorsque M est mis en mémoire, le premier entier 1 sera masqué et seule la partie décimale sera stockée. Comme M commence toujours par un entier 1, ajoutez simplement le premier 1 lors de sa suppression. Cela ne causera aucun malentendu , mais peut l'augmenter.Une précision, pourquoi ne pas le faire?
Le E est un entier non signé , c'est-à-dire que E ne peut être qu'un nombre positif, mais dans les applications réelles, l'exposant doit être négatif. Pour exprimer le positif et le négatif, un concept appelé le nombre du milieu apparaît, ce qui est stocké dans E Lorsque vous devez d'abord ajouter le nombre intermédiaire, puis le stocker dans la mémoire, IEEE 754 stipule que le nombre intermédiaire de double précision est 1023, et le nombre intermédiaire de précision simple est 127. Prenons float comme exemple , par exemple:
Insérez la description de l'image ici
E a deux cas particuliers, Lorsque l'exposant d'un nombre est tout 1 ou tout 0, et tous sont 1, alors E est en fait 128. La 128e puissance de 2 est sans aucun doute un très grand nombre, et parce que M est un nombre entre 1 et 2. Nombre, alors on peut simplement comprendre que ce nombre est infini, quand tout 0, la valeur réelle de E devrait être -127, 2 à la puissance -127 est sans aucun doute un nombre très proche de 0 , donc ce nombre peut être directement La partie décimale est prise comme sa propre valeur, et il n'est pas nécessaire d'ajouter l'initiale 1. Le positif et le négatif dépendent de S. L'IEEE 754 stipule également l' Insérez la description de l'image ici
image ci - dessus. l'image est interceptée par le blogueur du réseau chinois de langue C. pour que les lecteurs puissent s'y référer. Le lien est attaché au poke Je vais au texte original

Écrit à la fin

À ce stade, je dois lire et réfléchir attentivement au stockage des entiers et des types à virgule flottante. De nombreux types de données correspondent à de nombreux symboles de contrôle de format, et chaque symbole de format correspond à un ou plusieurs types. Si vous faites une erreur accidentellement, il y aura des résultats d'exploitation inattendus. Il n'y a pas lieu de paniquer pour le moment. Nous pouvons lentement déboguer notre code et rechercher le problème ligne par ligne. Ce blog s'arrêtera ici. C'est fini, j'espère être utile aux amis. En raison de mon niveau limité, il y a inévitablement des erreurs ou des expressions peu claires dans l'article. Bienvenue amis à laisser un message dans la zone de commentaire ou à m'envoyer un message privé pour le signaler, voir notre prochain blog.

Je suppose que tu aimes

Origine blog.csdn.net/JunFengYiHan/article/details/114462556
conseillé
Classement