Stockage des données en langage C

Table des matières

1.Type de données

1. Famille entière

2. Famille à virgule flottante

 3. Type de structure

(1), type de tableau :

(2), type de structure :

(3), type d'énumération :

(4), type commun :

 4. Type de pointeur

 5. Type vide

Deuxièmement, le stockage des entiers en mémoire

 3. Stockage des nombres à virgule flottante en mémoire

1. Règles de stockage des nombres à virgule flottante

2. Stockage des nombres à virgule flottante pour les trois valeurs de S, M et E

3. Trois situations dans lesquelles l'index E est sorti de la mémoire

(1) Le cas où E n'est pas entièrement 0 ou pas entièrement 1

(2) Le cas où E est entièrement 0

(3) Le cas où E est tout 1

 4. Stockage des commandes d'octets gros et petits endian



1.Type de données

Après l'étude précédente, nous avons appris que les types de données en langage C sont grossièrement :

char, short, int, long, long long, float, double   ces types

Pour plus de détails, veuillez consulter les types de données de la première introduction au langage C que j'ai publiée plus tôt !

Peut être divisé en les types suivants :

1. Famille entière

Il comprend les types char, short , int et long . Sous ces types, ils sont divisés en deux types : signé et non signé .

Parmi eux, les signés sont exprimés comme : signés ... ,

La représentation non signée est : non signée...

Par exemple, le type entier signé est : entier signé , le type entier court non signé : unsigned short [int] (int peut être écrit ou non)

Bien sûr, certains étudiants attentifs découvriront pourquoi il existe des données de type char dans la famille entière ?

En fait, bien que char soit un type de caractère, le type char stocke sa valeur de code Ascii dans l'ordinateur , et la valeur du code Ascii est un entier , donc le type char est naturellement inclus dans la famille des entiers !

Notez que s'il s'agit de données avec un bit signé, le bit le plus élevé est le bit de signe , et si le bit le plus élevé est 0 , cela signifie un nombre positif , et si le bit le plus élevé est 1 , cela signifie un nombre négatif.

S'il s'agit de données non signées, le bit le plus élevé est également un bit de données et il n'y a pas de positif ou de négatif de 0/1.

N'oubliez pas les points ci-dessus


2. Famille à virgule flottante

On l'appelle la famille des nombres à virgule flottante, donc les membres de cette famille sont naturellement de type flottant et double.

Parmi eux, tout le monde sait que float est un type à virgule flottante simple précision et double est un type à virgule flottante double précision.

Cette famille est très simple, nous la connaissons bien, alors passons à la famille suivante.


 3. Type de structure

Les types construits sont également appelés types personnalisés

Divisé en quatre catégories suivantes, à savoir : type de tableau, type de structure, type d'énumération, type d'union

Parlons de ces types en détail

(1), type de tableau :

Pourquoi dit-on que le type tableau est un type personnalisé ?La raison est très simple.Par exemple, tout le monde comprendra la raison.

Par exemple : int arr[10] , pour créer un tel tableau, supprimez le nom du tableau arr , le int [10] restant est le type , et par exemple char p[20], supprimez le nom du tableau p, le caractère restant [20] est le type, donc lors de la création d'un tableau, il existe de nombreux types et ils sont tous créés selon vos propres besoins, donc le type de tableau est naturellement appelé type construit ou type personnalisé ! 

(2), type de structure :

La structure a le mot-clé struct, la structure doit créer un nom, puis y créer des membres, et les membres peuvent attribuer leurs propres valeurs. Par exemple, si vous définissez une structure Student, vous pouvez y définir le nom : char name[20], age : int age , numéro d'étudiant : char id[20] , etc., peuvent naturellement aussi être appelés types structurels !

~~~~ Concernant le contenu spécifique de la structure, un blog sera publié prochainement pour partager les connaissances

(3), type d'énumération :

Le mot-clé du type énumération est : enum , que j'ai expliqué en détail dans le blog précédent - les mots-clés du langage C pour la première fois et comment l'utiliser. Veuillez faire attention à mon blog précédent.

(4), type commun :

Le mot-clé du type commun est : union. Tout le monde sait que ce type l’a. Vous n’avez pas besoin d’en savoir trop. Si vous êtes intéressé, vous pouvez consulter les informations en ligne pour approfondir vos connaissances.


 4. Type de pointeur

Il existe à peu près les types de pointeurs suivants, qui devraient être familiers à tout le monde

int* p,char* p,float* p,void* p

La seule chose à laquelle il faut prêter attention est le dernier pointeur vide, que nous n'avons jamais vu auparavant, il suffit de le comprendre


 5. Type vide

void représente un type vide (pas de type )

Ceci est généralement appliqué au type de retour de la fonction , aux paramètres de la fonction et au type de pointeur mentionné ci-dessus , etc.


Deuxièmement, le stockage des entiers en mémoire

En parlant de stockage en mémoire, vous devez d'abord comprendre les trois concepts de code original, de code inverse et de code complémentaire.

Code d'origine :

Il est possible de traduire directement la valeur en binaire sous forme de nombres positifs et négatifs

Code inverse :

Le bit de signe du code original reste inchangé, et les autres bits sont inversés petit à petit

complément:

Inverse +1 pour obtenir le complément

Attention Note : Ce qui est stocké en mémoire est le complément des données ! !

Ces trois représentations ont un bit de signe et un bit de valeur, bit de signe : 0 signifie positif, 1 signifie négatif

Pour les nombres positifs , le code original, le code inverse et le code complément sont les mêmes

Par exemple : int a = 1 ; le bit de signe de a est positif, alors le bit le plus élevé de a est 0

Alors le code original de a est : 00000000 00000000 00000000 00000001, le code inverse du nombre naturel positif a, et le code complément est naturellement celui-ci

Notez ici : comme a est un entier, il occupe quatre octets et 32 ​​bits, le code original est donc une séquence binaire composée de 32 0 et 1.

Pour les nombres négatifs, il satisfait la conversion mutuelle du code original, du code inverse et du code complémentaire mentionnés ci-dessus. Donnons un exemple.

int b = -1 ; le bit de signe de b est négatif, alors le bit le plus élevé de b est 1

Alors le code original de b est : 10000000 00000000 00000000 00000001

Le code inverse de b est : 11111111 111111111 11111111 11111110 ( le bit de signe reste inchangé et les autres bits sont inversés )

Le complément de b est : 11111111 111111111 11111111 11111111 ( complément +1 )

On voit que ce que b stocke en mémoire est le complément de b : 11111111 111111111 11111111 11111111

C’est la fin de la connaissance du stockage des entiers en mémoire !


 3. Stockage des nombres à virgule flottante en mémoire

1. Règles de stockage des nombres à virgule flottante

Selon les normes internationales, tout nombre binaire à virgule flottante V peut représenter la forme suivante :

(-1)^S * M * 2^E

(-1)^S représente le bit de signe , quand S=0 , V est un nombre positif , quand S=1 , V est un nombre négatif

M représente un nombre valide , M est supérieur ou égal à 1 et inférieur à 2

2 ^ E signifie bit d'exposant

Donnons un exemple pour illustrer ces trois valeurs en détail.

9.0 s'écrit sous forme binaire comme suit : 1001.0

1001,0=(-1)^0 * 1,001* 2^3

C'est-à-dire S=0, M=1,001, E=3, tout le monde peut le comprendre plus profondément selon cet exemple !

2. Stockage des nombres à virgule flottante pour les trois valeurs de S, M et E

réglementation standard :

Pour les nombres à virgule flottante de 32 bits ( nombres à virgule flottante simple précision : float ), le bit le plus élevé est le bit de signe S , les 8 bits suivants sont l'exposant E et les 23 bits restants sont le nombre effectif M

Pour les nombres à virgule flottante de 64 bits ( nombres à virgule flottante double précision : double ), le bit le plus élevé est le bit de signe S , puis 11 bits sont l'exposant E et les 52 bits restants sont le nombre effectif M

Remarque : Lorsque le nombre effectif M est stocké, 1 peut être omis, car M doit être précédé de 1, et un bit supplémentaire peut être stocké lorsqu'il est omis.

L'index E est plus compliqué. Premièrement, E est un entier non signé. La plage de valeurs de 8 bits est : 0 à 255 et la plage de valeurs de 11 bits est : 0 à 2047. Cependant, E peut avoir des nombres négatifs, et l'indice E est plus compliqué. la norme stipule : Ajouter un numéro intermédiaire lors du stockage en E, +127 pour 8 chiffres , +1023 pour 11 chiffres.

Laisse moi te donner un exemple.

flotteur f = 5,5 ;

5,5 converti en binaire est 101,1, alors 101,1 = (-1) ^ 0 * 1,011 * 2 ^ 2

S=0,M=1,011,E=2+127=129

Stockez ensuite en mémoire :

Le binaire est : 0 10000001 01100000000000000000000

Convertir l'hexadécimal en : 0x 40 b0 00 00

3. Trois situations dans lesquelles l'index E est sorti de la mémoire

(1) Le cas où E n'est pas entièrement 0 ou pas entièrement 1

Soustrayez 127 (ou 1023) de la valeur calculée de l'exposant E pour obtenir la valeur réelle, puis ajoutez le nombre effectif M au premier chiffre 1

(2) Le cas où E est entièrement 0

L'exposant E du nombre à virgule flottante égal à 1-127 (ou 1-1023) est la valeur réelle, M n'additionne pas le premier 1, mais le restitue à un nombre décimal de 0. petits nombres

(3) Le cas où E est tout 1

Représente l'infini positif et négatif (positif ou négatif dépend du bit de signe S)

Remarque : Vous devez principalement comprendre la première situation et seulement comprendre les deuxième et troisième situations.


 4. Stockage des commandes d'octets gros et petits endian

En parlant de stockage big et small endian, vous avez peut-être entendu parler de ce concept, alors commençons par comprendre le concept de base du stockage big et small endian.

Stockage big-endian :

Stockez les données dans l'octet de poids faible d'une donnée à l'adresse haute et stockez les données dans l'octet de poids fort à l'adresse basse

Stockage petit-boutiste :

Stockez les données dans l'octet de poids faible d'une donnée à l'adresse basse et stockez les données dans l'octet de poids fort à l'adresse haute

Laissez-moi vous expliquer le concept

Par exemple : je crée un entier a, exprimé sous forme hexadécimale

int a = 0x11 22 33 44 ; 0x ici est le signe hexadécimal, 11 est le bit le plus élevé et 44 est le bit le plus bas

Ensuite, par exemple, de gauche à droite dans la mémoire , l'adresse va de l'adresse basse à l'adresse haute , comme le montre la figure :

L'image suivante montre le stockage big-endian :

 L'image suivante montre le stockage Little-Endian :

 

Après vérification, il s'avère que le compilateur VS  que nous utilisons habituellement est un stockage small-endian . Les étudiants intéressés par d'autres compilateurs peuvent venir le vérifier par eux-mêmes.


Ce qui précède est le contenu lié au stockage de données dont nous avons parlé aujourd'hui, rendez-vous dans le prochain blog ! !

Je suppose que tu aimes

Origine blog.csdn.net/m0_64411530/article/details/123720764
conseillé
Classement