Présentation et traitement de l'information du chapitre 2 du Guide du csapp

Howard 496 2022-01-14 22:51:26

CSAPPIntroduction2Chapitre Présentation et traitement des informations

Tout le monde sait,Le stockage de l'ordinateur repose sur des signaux binaires,Qu'est - ce que la valeur binaire?,Deux, c'est soit ça, soit ça.0,Ou1,Ces deux seules valeurs sont stockées sur l'ordinateur,Alors,Pourquoi ce design??

C'est parce que nous n'avons que2Les valeurs sont faciles à représenter,Par exemple, nous pouvons utiliserSignaux analogiquesReprésentation,High Level Representative1,Et le bas niveau représente0,Bien sûr.,Les signaux analogiques peuvent fluctuer,Mais tant qu'on en a un,Seuil,Sont considérés comme des niveaux élevés ou faibles lorsque les fluctuations de tension ne dépassent pas ce seuil,Pour pouvoir les utiliser facilement.Dans la figure ci - dessous,Nous avons mis en place des niveaux élevés0.9Và1.1V,Tant que la tension est dans cette plage,C'est un niveau élevé.,Encore une fois,Si oui0.0VEt0.2VEntre,Est considéré comme faible,Et nous avons fait la distinction0Et1.

image-20220111234949813

Imagine ça.,Si vous voulez l'exprimer en décimales,Ce n'est pas nécessaire.10Plages de tension,C'est gênant.,Donc,,L'ordinateur est utilisé0Et1Ces deux valeurs représentent toutes les informations.En fait, Toutes les informations sont disponibles 0Et1Pour représenter, Les chiffres peuvent être les mêmes , Mais la perception de cette série de chiffres peut être différente ,Comme un32Bitwise01Chaîne, Peut être interprété comme un 32Un entier de bits, Bien sûr, vous pouvez aussi le considérer comme un 32Nombre de points flottants de bits( On en parlera plus tard. ), Vous pouvez même le considérer comme une instruction ou quelque chose de plus compliqué .

Avant de commencer à parler des détails des entiers et des points flottants , Voyons un fait si intéressant —— Un entier dans un ordinateur n'est pas un entier réel , Et le nombre de points flottants dans l'ordinateur n'est pas le nombre réel de points flottants .

Ça a l'air drôle, non? , Pourquoi ne pas regarder ces deux exemples :

  1. x 2 x^2 Doit être supérieur ou égal à0- Oui.? Pour les nombres flottants,C'est vrai,Mais pour les entiers,Ce n'est pas le cas, C'est un peu contre - intuitif .Par exemple,,PourCLangues, 5000 0 2 50000^2 Je l'aurai.-1794967296Les résultats de, C'est un nombre négatif. . La raison en est le débordement. (overflow), Nous expliquerons plus en détail .
  2. (3.14+1e20)-1e20 == 3.14+(1e20-1e20) C'est vrai? ? Expliquez d'abord,1e20Représentation1Multiplier par10De20Secondaire. On dirait que c'est le taux de liaison de l'addition ,Mais en fait, Le résultat du premier est 0.0, Le résultat de ce dernier est: 3.14,C'est parce que pour1e20En termes3.14Trop petit, Comme le nombre de chiffres est limité, il ne peut être arrondi qu'à , Donc le premier est équivalent à 1e20-1e20.

Comme vous pouvez le voir dans l'exemple ci - dessus , Il y a une différence entre les calculs de l'ordinateur et nos calculs mathématiques habituels ,Mais, Ces écarts sont prévisibles. ,Pas au hasard.

2.1 Stockage de l'information

La plupart des ordinateurs utilisent 8Bits, C'est - à - dire qu'un octet est la plus petite Unit é adressable , Qu'est - ce qu'une unit é adressable? , La mémoire peut être considérée comme un long tableau , Donc chacun de ces éléments a un indice correspondant , Nous pouvons trouver l'élément désiré par l'indice , La plus petite Unit é qui puisse être trouvée , C'est une unit é adressable , Un tel indice , C'est ce qu'on appelle l'adresse .

2.1.1 Hexadécimal

En général, En utilisant une longue chaîne 01C'est trop gênant., Ça a l'air éblouissant, non? , Donc nous utilisons la représentation hexadécimale dans la plupart des cas ,Prends ça.4Le nombre binaire de bits devient1Bit Hex, Ce n'est pas beaucoup plus court .Hexadécimal0-9 Comme le décimal ,Et10-15UtiliserA-FReprésentation:

Hexadécimal A B C D E F
Décimal 10 11 12 13 14 15
Binaire 1010 1011 1100 1101 1110 1111

Utiliser0xOu0X Le début est considéré comme un nombre hexadécimal ,En même temps,A-F Case insensible for ,Par exemple,0xFa1D37b C'est un nombre hexadécimal .

Conversion binaire en hexadécimal C'est possible.: Commencez un binaire à partir du bas de chaque 4 Division bitone ,Et puis chaque4 Écrivez le nombre hexadécimal correspondant .

Par exemple,1101110Divisé en110 1110, Puis le nombre hexadécimal correspondant est 6 E, Est le nombre hexadécimal correspondant .

Conversion hexadécimale en binaire C'est possible.: Écrivez chaque hexadécimal dans le binaire correspondant .

Par exemple,3C2D,3Correspondant à0011,CCorrespondant à1100,2Correspondant à0010,DCorrespondant à1101, Alors le binaire est 0011 1100 0010 1101.

2.1.2 Taille des données du mot

Il y a des octets ,Un octet est8Bitsbit,C'est - à - dire8- Oui.0Ou1, Qu'est - ce qu'un mot? , Ça a un rapport avec les octets ?

Il n'y a rien de plus central dans un ordinateur CPUCPU, Comme le cerveau humain ,L'un d'eux s'appelleUnit é logique arithmétiqueALUParties de,ALU Est responsable de l'informatique , Comme l'addition, la soustraction, la multiplication et la Division ,Tout dépend.ALU.Mais,ALU Les données qui peuvent être traitées sont limitées par la longueur , C'est une limite matérielle , Pour une machine particulière ,C'est...ALU Peut traiter au mieux 32Données bitwise,Ou64Données bitwise,C'est de ça qu'il s'agit.32 Ordinateur local ou 64Ordinateur local, Et la taille des données qu'une telle machine peut traiter , Ça s'appelle un Mots(word).

En général, Combien de temps dure le mot , Combien de temps dure le BIT d'adresse? ,Donc pour un32Machine bit, L'Unit é d'adresse adressable a 2 32 2^{32} - Oui..

C La langue supporte plusieurs types de données , Il peut être de tailles différentes sur des machines de différentes longueurs de mots ,Par exemple,long - Oui. 32Il y a4Octets(32Bits),In64Il y a8Octets(64Bits).C'est facile à comprendre.,Je pensais...32Machine à bitsALU On peut s'en occuper en une seule fois. 32Un entier de bits,64 L'ordinateur local est 64Bits, Plus tard, nous parlerons du flotteur. .

C Data Type Typical 32-bit Typical 64-bit x86-64
char 1 1 1
short 2 2 2
int 4 4 4
long 4 8 8
float 4 4 4
double 8 8 8
long double 10/16
pointer 4 8 8

2.1.3 Ordre des octets

On peut le savoir d'en haut., Un mot contient plusieurs octets ,Ça pourrait être4- Oui.,Ou peut - être8- Oui.,Alors la question se pose,En mémoire, Comment placer plusieurs octets dans un mot ,Par exemple,,Il y a un32Le mot bit0x01234567, L'espace d'adresse mémoire qui lui est attribué est 0x100À0x103Voilà.4Octets, Donc pour les octets 67, On dirait qu'on peut le mettre dans 0x100,Peut également être placé0x103,L'intuition nous dit, Autant le mettre dans l'ordre. ,Comme ci - dessous:

Octets 01 23 45 67
Adresse 0x100 0x101 0x102 0x103

Alors, c'est pas possible? , Bien qu'il semble un peu anti - humain :

Octets 01 23 45 67
Adresse 0x103 0x102 0x101 0x100

En fait, C'est deux formes différentes d'organisation des octets , Le genre au - dessus qui s'appelle Big end , En dessous se trouve la petite extrémité , C'est comme ça que ça se distingue dans le livre. :Le plus petit octet valide est en haut, Appelé petit bout , Et le plus grand octet valide est devant , Appelé Big end .

Regarde en bas (Octets),Pour l'exemple ci - dessus,Le bas est67, Si elle est placée à basse adresse ,C'est - à - dire:0x100,Petite extrémité, Si elle est placée à haute adresse 0x103,C'est grand..

image-20220112115034337

En fait, Les deux méthodes sont utilisées par le fabricant , Par exemple, les grandes extrémités sont typiques de Sun(MaintenantOracleAcquis) La transmission de la machine et du réseau ( Donc si vous utilisez une petite machine , Certaines opérations peuvent être nécessaires lors de l'utilisation de la transmission réseau ), Et les petites extrémités sont typiques x86、ARMAttendez un peu!, La plupart des machines d'aujourd'hui sont de petites extrémités , Donc vous ne verrez probablement pas de grandes machines .

La source des noms grand et petit est les voyages de Gulliver , Il s'agit de manger des œufs à partir d'une grande extrémité , C'est un petit bout. . Si vous êtes intéressé, consultez la description dans le Manuel .

Voyons la différence entre une grande et une petite machine , Comme avoir une variable plastique A, Alors c'est dans la grande machine Sun Et les petites machines x86 Les différences sont les suivantes: :

int A = 15213; // Hex est3B6D
Copier le Code

image-20220112120407778

Note:: C'est une adresse basse. ,Voici l'adresse haute.

Si nous voulons un programme qui nous montre à quoi ressemblent certains octets à partir d'une adresse , Vous pouvez utiliser la routine suivante :

typedef unsigned char *pointer;
void show_bytes(pointer start, size_t len){
size_t i;
for (i = 0; i < len; i++)
printf(”%p\t0x%.2x\n",start+i, start[i]); printf("\n"); } Copier le Code

Note::InC++Moyenne,Conceptionsize_t Pour s'adapter à plusieurs plateformes .size_t L'introduction de la technologie a amélioré la portabilité des programmes sur différentes plateformes .size_t Est un type de données personnalisé pour le système , En général, un entier ,Parce queC/C++ La norme ne définit qu'un nombre minimal de chiffres , Au lieu des chiffres fixes requis . Et en mémoire , Logarithme haut ou bas aligné le stockage est différent d'un système à l'autre . Pour améliorer la portabilité du Code , Il est nécessaire de définir un tel type de données .

Utiliserchar Le pointeur de type est parce que char Exactement un octet .

Par exemple,, Imprimer le stockage en mémoire d'une variable entière :

int a = 15213;
printf("int a = 15213;\n");
show_bytes((pointer) &a, sizeof(int));
Copier le Code

Inx86、windows Les résultats de la course sur la machine du système sont les suivants :

int a = 15213;
000000000062FE1C 0x6d
000000000062FE1D 0x3b
000000000062FE1E 0x00
000000000062FE1F 0x00
Copier le Code

Il est évident que, C'est une petite machine .

En plus, Si vous regardez la même valeur , Représentation en octets sur différentes machines et systèmes d'exploitation , Une chose merveilleuse à découvrir ,Pour les gens,12345Et12345.0Ça devrait être égal.,Mais dansintEtfloat Les représentations sur sont très différentes ,Comme le montre la figure ci - dessous:,L'un est00 00 30 39,Et l'autre est46 40 E4 00, Expand to Binary ,Respectivement.0000 0000 0000 0000 0011 0000 0011Et0100 0110 0100 0000 1110 0100 0000 0000, Une comparaison montre qu'il y a 13 Les bits correspondent ,Ce n'est pas une coïncidence., Nous aurons une explication correspondante lorsque nous apprendrons les nombres flottants plus tard .

image-20220112134429987

Valeurs imprimées du pointeur et du système d'exploitation 、 Le compilateur est étroitement lié , Il est même possible d'obtenir des résultats différents à chaque course Different compilers & machines assign different locations to objects

2.1.4 Représentation par chaîne

Les chaînes sont beaucoup plus simples que les nombres , Pour différentes machines , La représentation de la chaîne imprimée dans la mémoire virtuelle est la même , Parce que tout est adopté ASCII Représentation du Code , Et cela n'a rien à voir avec l'ordre des octets décrit ci - dessus , Il est donc très compatible .Comme vous pouvez le voir dans l'illustration suivante, Pour cette chaîne de caractères , Il n'y a pas de différence entre les grandes et les petites machines .

image-20220112135435919

image-20220112135442738

2.1.5 Code de représentation

Comment le Code est - il représenté dans la machine , Par exemple, il y a le paragraphe suivant CCode du programme:

int sum(int x, int y){
return x + y;
}
Copier le Code

Compiler sur différentes machines , Le Code de la machine est différent , C'est parce que différentes machines utilisent des instructions différentes ,Le code binaire est donc incompatible, Il est difficile de déplacer des valeurs entre différentes machines ou systèmes d'exploitation .

2.1.6 Algèbre booléenne

L'algèbre booléenne est 19 Au siècle dernier, George · Boole a inventé , Puis Shannon a d'abord établi le lien entre l'algèbre booléenne et la logique numérique . Pour l'algèbre booléenne ,Prends ça.1Comme si c'était le cas.Ture,Prends ça.0Comme si c'était le cas.False.

Il y a plusieurs opérations de base :

  • AndAvec:Les deux.1Le résultat est1
  • OrOu: Si l'un des deux est 1,Les résultats sont les suivants:1
  • NotNon:1Devenir0,0Devenir1
  • XorXOR(Exclusive-Or), Deux fois différentes. 1

image-20220112140621962

Opérations de bits: Faites ces opérations ci - dessus sur le vecteur bit , Un vecteur bit est une chaîne de 01,Par exemple,01101001. Voici quelques exemples :

image-20220112140839066

Beaucoup de fois, On va utiliser des vecteurs de bits , C'est une chaîne de 01 Pour représenter un ensemble fini ,Par exemple,01101001,En fait,,Si nous prenons tout1Emplacement( L'emplacement du chiffre le plus à droite est indiqué comme suit: 0)Écris - le, C'est - à - dire un ensemble équivalent { 0 , 3 , 5 , 6 } \{0,3,5,6\} . Cette représentation est utile ,Quelques exemples simples,Par exemple, nous avons maintenant10Un signal, C'est une collection de signaux , Nous devons en bloquer certains. , Alors nous pouvons nous souvenir de ce qui a été bloqué 0,Et vice versa1, Pour qu'on puisse utiliser 10 Les vecteurs de bits représentent les bits .

2.1.7 C L'opération bitwise de la langue

C La langue supporte également l'arithmétique bitwise , Et le même symbole que celui utilisé ci - dessus , Voici quelques exemples :

image-20220112142346726

Lors de l'exécution de bits sur Hex ,Convertir d'abord en binaire, Parce que seul le binaire peut voir un chiffre spécifique est 0Toujours1, Enfin converti en hexadécimal .

2.1.8 C Fonctionnement logique de la langue

Les opérations logiques et bitwise sont souvent mélangées , Parce qu'ils se ressemblent tellement. , Les opérations logiques ont aussi AvecOuEtNonTrois,Utilisez séparément&&||!Pour représenter.

Quelle est la différence entre cette opération logique et l'opération bitwise ?

Dans les opérations logiques,Tout ce qui compte, c'estTrueEtFalse,Comme son nom, Ne vous souciez que de cette logique , Par exemple, pour la logique et ,Les deux.TrueLe résultat estTrue, Pour la logique ou ,Juste un pourTrue,Le résultat estTrue, Non, oui. TrueChangementFalse,FalseChangementTrue.

Qu'est - ce que c'est?True,Qu'est - ce que c'est?FalseEt alors??

InCDans la langue,Non zéro est vrai,C'est - à - dire, Peu importe le nombre , Les chiffres indiquent comment ,Tant que ce n'est pas le cas.0,C'est vrai..Par exemple,,0x69- Oui.True,0x55C'est aussiTrue, Donc leur relation avec le résultat est True,EtCDans la langueTrueC'est1, Il y a donc une formule :

0 x 69   & &   0 x 51 = 0 x 01 0x69 \space \&\& \space 0x51 =0x01

De même, il y a la formule suivante: :

image-20220112143300609

2.1.9 Opération Shift

Qu'est - ce qu'un déplacement? ,Pour unw Vecteur de bits de bits [ x w 1 , x w 2 , . . . , x 0 ] [x_{w-1},x_{w-2},...,x_0] , Vous pouvez déplacer chacun à gauche ou plusieurs à droite , Mais il y a un problème évident , C'est en se déplaçant à gauche , Il va sûrement x w 1 x_{w-1} Sortez d'ici., Pendant ce temps x 0 x_{0} L'emplacement sera vide. , Parce que les chiffres sont fixes , Et en se déplaçant à droite , Et il va sûrement mettre x 0 x_0 Sortez d'ici., Pendant ce temps x w 1 x_{w-1} L'emplacement sera vide. .

Pour le déplacement à gauche ,C'est simple., Celui qui est sorti est sorti , Et quand je le fais 0C'est tout.,C'est ça.À gauche.,Le symbole est<<.

Par exemple, maintenant il y a un nombre x = 01100011 x=0110 0011 ,Alors oui.:

x << 4 = 0011 0000
Copier le Code

A droite 4- Oui.0 C'est tout. , Et à gauche 4 Les quatre premiers à droite. .

Et pour le déplacement à droite , Mais ils sont divisés en deux ,Un type appeléDéplacement logique à droite,Un type appeléDéplacement arithmétique à droite, Le déplacement logique à droite fonctionne comme ci - dessus ,Supplément vide0C'est tout., Et le déplacement arithmétique à droite n'est pas , L'arithmétique est déplacée à droite pour s'assurer que les nombres signés ne changent pas plus ou moins ( Parce que le BIT le plus élevé est le BIT de symbole ), Ajoute des bits de symbole aux bits supérieurs vides , Pas tous les cas. 0.

Plus que ça. x = 10010101 x=1001 0101 ,Alors oui.:

x >>(Déplacement logique à droite) 4 = 0000 1001
x >>(Déplacement arithmétique à droite) 4 = 1111 1001
Copier le Code

Pour les nombres signés , La valeur par défaut est d'utiliser un déplacement arithmétique à droite , Et pour les nombres non signés , Ça ne peut être qu'un déplacement logique à droite .

JavaAvecCC'est différent.,Utiliser>> Indique un déplacement arithmétique à droite ,Et>>>Indique un déplacement logique à droite.

Peut - être qu'il y a des camarades de classe ici qui demandent : Et si le nombre de bits déplacés dépasse le nombre de bits ?Par exemple, je n'ai que8Bits, Mais tu veux que je bouge 12Bits, Si c'est un déplacement logique , Le résultat sera complet. 0- Oui.?

La réponse est:, Quand le nombre de bits déplacés k k Nombre de bits supérieur ou égal à lui - même w w , En fait, le nombre de bits déplacés est k   m o d   w k \space mod \space w Bits.Comme dans l'exemple ci - dessus.,8Shift left12Bits, Ça ne fait que bouger 4Bits(12 mod 8).

Enfin, Indiquer la priorité de l'opération de déplacement , La priorité de l'opération Shift est inférieure à celle de l'opération addition - soustraction , Donc si vous voulez passer en premier , Veuillez ajouter les parenthèses , Quand je ne peux pas manger , Ajoutez tout. .

En bas, Nous examinerons deux catégories de données les plus courantes ——EntierEtNombre de points flottants.

2.2 Représentation intégrale

Dans la vie, Les entiers sont courants , Un entier comprend un entier positif ,Entier négatif et zéro, Donc dans l'ordinateur, , Comment représenter un entier ?

2.2.1 Données entières

C La langue fournit beaucoup de données entières ——char、short、int、long, Parce que le programme est compilé 32BIT ou64 Les bits font que la longueur correspondant au type de données est différente ,L'image de gauche ci - dessous montre32 Bitcompilé ,La figure de droite est64 Bitcompilé .

image-20220112155939873image-20220112160020458

La seule différence ici estlongPlage de représentation de,Le reste32Bits et64Les bits sont les mêmes,Voilà.2.1.2SectionJ'ai parlé de.

Si vous regardez attentivement , On trouve une plage de valeurs positives et négatives et une asymétrie , Les nombres négatifs seront un de plus que les nombres positifs ,En fait,, Parce que l'ordinateur est binaire , Donc ce qui peut être exprimé doit être 2Puissance entière de, Ça doit être pair ,Et pourtant,Nous avons0Existe, Si les nombres positifs et négatifs sont les mêmes ,Alors, plus0 C'est un nombre impair ,C'est - à - dire, Soit un nombre positif de moins , Soit il y a moins d'un négatif ,Et donc,,InComplémentDans la représentation de, Les nombres négatifs sont plus nombreux que les nombres positifs , Nous détaillerons le complément plus loin .

2.2.2 Nombre non signé

Supposons que nous ayons maintenant un nombre non signé x x , Son vecteur de bits est représenté par x = [ x w 1 , x w 2 , . . . , x 0 ] x=[x_{w-1},x_{w-2},...,x_0] , Quelle est la valeur réelle? ?

Nous définissons une telle fonction B 2 U w B2U_w ,ReprésentationBinary(Binaire)to Unsigned(Sans symbole):

B 2 U w ( x ) = Σ i = 0 w 1 x i 2 i B2U_w(\vec{x})=\Sigma_{i=0}^{w-1}x_i2^i

Ça a l'air abstrait , Mais en fait, c'est donner à chaque binaire un poids différent ( 2 i 2^i ), Et puis la somme pondérée .Voici quelques exemples::

B 2 U 4 ( [ 0001 ] ) = 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0 = 1 B2U_4({[0001]})=0\times2^3+0\times2^2+0\times2^1+1\times2^0=1 B 2 U 4 ( [ 0101 ] ) = 0 × 2 3 + 1 × 2 2 + 0 × 2 1 + 1 × 2 0 = 5 B2U_4({[0101]})=0\times2^3+1\times2^2+0\times2^1+1\times2^0=5 B 2 U 4 ( [ 1011 ] ) = 1 × 2 3 + 0 × 2 2 + 1 × 2 1 + 1 × 2 0 = 11 B2U_4({[1011]})=1\times2^3+0\times2^2+1\times2^1+1\times2^0=11 B 2 U 4 ( [ 1111 ] ) = 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0 = 15 B2U_4({[1111]})=1\times2^3+1\times2^2+1\times2^1+1\times2^0=15

NoiBits No4Bits No3Bits No2Bits No1Bits No0Bits
Poids 2 i 2^i 16 8 4 2 1

Pour unw Bits entiers non signés , La plage de valeurs est bien confirmée ,Le plus petit est 000..0 000..0 , Et le plus grand est 111..1 111..1 ,C'est - à - dire: 0 2 w 1 0 — 2^{w-1}

2.2.3 Complément

Les nombres non signés ne peuvent représenter que des nombres non négatifs , Mais nous demandons souvent des nombres négatifs ,Qu'est - ce qu'on fait?, Alors les gens ont inventé Complément(Two's Complement), Il peut représenter un nombre non négatif , Peut également représenter un nombre négatif . Supposons que nous ayons maintenant un nombre représenté par un complément x x , Son vecteur de bits est représenté par x = [ x w 1 , x w 2 , . . . , x 0 ] x=[x_{w-1},x_{w-2},...,x_0] , Quelle est la valeur réelle? ?

Nous définissons une telle fonction B 2 T w B2T_w ,ReprésentationBinary(Binaire)to Two's Complement(Complément):

B 2 T w ( x ) = x w 1 × 2 w 1 + Σ i = 0 w 2 x i 2 i B2T_w(\vec{x})=-x_{w-1}\times 2^{w-1}+\Sigma_{i=0}^{w-2}x_i2^i

Pour le complément , Pour représenter plus ou moins , Il doit y avoir un bit de symbole ,C'est le niveau le plus élevé,Si oui0C'est un nombre positif, Inversement, un nombre négatif . Lors du calcul de sa valeur , Le poids le plus élevé est considéré comme 2 w 1 -2^{w-1} ,Les autres bits restent inchangés. Encore quelques exemples :

B 2 T 4 ( [ 0001 ] ) = 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0 = 1 B2T_4({[0001]})=0\times2^3+0\times2^2+0\times2^1+1\times2^0=1 B 2 T 4 ( [ 0101 ] ) = 0 × 2 3 + 1 × 2 2 + 0 × 2 1 + 1 × 2 0 = 5 B2T_4({[0101]})=0\times2^3+1\times2^2+0\times2^1+1\times2^0=5 B 2 T 4 ( [ 1011 ] ) = 1 × 2 3 + 0 × 2 2 + 1 × 2 1 + 1 × 2 0 = 5 B2T_4({[1011]})=-1\times2^3+0\times2^2+1\times2^1+1\times2^0=-5 B 2 T 4 ( [ 1111 ] ) = 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0 = 1 B2T_4({[1111]})=-1\times2^3+1\times2^2+1\times2^1+1\times2^0=-1

Pour unw En termes de complément de bits , Voyons ce qu'il vaut. .

Déterminer d'abord la valeur minimale T M i n TMin ,Réfléchis un peu, Quel est le nombre minimum négatif? , Parce qu'à part le plus haut , Le poids des autres bits est positif , Disons que si c'est le plus petit , Il faut que les autres soient 0, Seul le BIT le plus élevé est 1,C'est - à - dire:1000..00,Alors il y a T M i n = 2 w 1 TMin=-2^{w-1} .

Alors le maximum T M a x TMax Et alors?,C'est facile, Il suffit que le BIT le plus élevé soit 0,Le reste.1,C'est - à - dire0111..11,Et donc, T M a x = 2 w 1 1 TMax=2^{w-1}-1 , Quand on compte. , En fait, ce nombre n'est pas signé. 1000..00Moins1.

La méthode de calcul décrite ci - dessus peut être un peu fastidieuse , Voici un autre ,Pour les nombres positifs, Son complément est le même que celui qui n'est pas signé , Et pour les nombres négatifs , Si un complément est demandé , Il suffit d'inverser toutes les représentations non signées des nombres positifs correspondants ,Encore.+1C'est tout..

Par exemple,-5Complément à, C'est demander d'abord 5 Non signé pour :0101, Donc tout est inversé et devient 1010,Plus.1,C'est - à - dire:1011,C'est-5Complément à.

Ou plutôt, Si le nombre opposé d'un nombre est requis , Il suffit d'inverser le complément de ce nombre ,Et ajouter1C'est tout..

Comme nous l'avons déjà dit, La plage de valeurs des nombres positifs et négatifs est asymétrique , Si vous connaissez le fonctionnement du complément et la plage de valeurs, vous pouvez le savoir , En fait, il y a une telle relation , T M i n = T M a x + 1 |TMin|=|TMax|+1 , Cette asymétrie est importante , De nombreux programmes ne correspondent pas à la réalité et c'est pourquoi ,Parce que pour T M i n TMin , Il n'y a pas de nombre positif correspondant .

En même temps, Il y a aussi cette conclusion : U M a x w = 2 T M a x w + 1 UMax_w=2TMax_w+1

2.2.4 Conversion de nombres signés et non signés

On a déjà dit ,Dans l'ordinateur, Toutes les informations sont exprimées en deux valeurs , La seule différence, c'est la façon dont nous percevons cette chaîne 01.Alors,Nous pensons à une telle question, Pour le même mode bit x \vec{x} , Quelle est la différence entre ce que nous considérons comme un complément et ce que nous considérons comme un nombre non signé , C'est comme ça qu'ils se convertissent. .

Voici un exemple simple. , Nous observons seulement 4 Complément de bits et conversion de nombres non signés :

image-20220112165500826

Je vois.,Lorsque le BIT de symbole est0Quand,Les deux sont équivalents,Et pour1Quand, C'est juste à côté 16( Le nombre non signé est plus grand que le complément 16),C'est - à - dire2De4Secondaire, C'est une coïncidence? ? Ce n'est pas vraiment , C'est une règle générale .

**Principes:**Conversion du complément en nombre non signé

Pour la satisfaction T M i n w x T m a x w TMin_w\le x\le Tmax_w , Il y a les règles suivantes :

T 2 U w ( x ) = { x + 2 w , x < 0 x , x 0 T2U_w(x)=\begin{cases} x+2^w&, x<0\\ x&,x\ge0 \end{cases}

Nous comprenons intuitivement cette loi , C'est bien compris quand on est positif ,QuandxQuand il est négatif,Le chiffre le plus élevé est1,Pour les nombres non signés, Son poids est 2 w 1 2^{w-1} , Mais pour le complément ,Son poids est 2 w 1 -2^{w-1} ,Donc de 2 w 1 -2^{w-1} Est devenu 2 w 1 2^{w-1} , C'est plus grand. 2 w 2^{w} . C'est ce qui suit, représenté graphiquement , Pour le complément -1En termes,Exprimé en111..11, Donc ce qui correspond au nombre non signé U M a x UMax .

image-20220113003106333

Convertir un nombre non signé en complément est soustraire 2 w 2^{w} C'est juste,Plus de détails ici.

2.2.5 C Nombre de langues signées et non signées

InCDans la langue, Le nombre non signé doit être spécifié , Parce que dans presque toutes les machines , Les chiffres sont signés par défaut ,InC La désignation d'un nombre non signé dans la langue se fait par l'ajout d'un UOuu.Par exemple,12345UOu0x1A2Bu.

C La langue supporte également la conversion de nombres non signés et de compléments ,Oui.Explicite Il y a aussi des conversions ImpliciteDe.

Explicite Le type de :

int tx, ty;
unsigned ux, uy;
tx = (int) ux;
uy = (unsigned) ty;
Copier le Code

La troisième ligne du code ci - dessus convertit un nombre non signé en un complément , Et la quatrième ligne est l'inverse .

Implicite Le type de , Une transformation implicite se produit lorsqu'une affectation est effectuée :

tx = ux;
uy = ty;
Copier le Code

Lorsqu'il est utiliséprintf Lors de la production ,Ça marche%d%u%xChacun avecDécimale signéeDécimal non signéEtHexadécimal Format valeur de sortie .

En utilisant l'opérateur de comparaison (<,>,==,<=,>=)Quand, Il y a aussi une transformation implicite , Quand il y a un nombre non signé de chaque côté de la comparaison , Si c'est un nombre signé de l'autre côté , Est converti en nombre non signé .

w=32Heure,TMIN = -2147483648 , TMAX = 2147483647, Les résultats de la comparaison sont les suivants: :

Numéro de série Valeur1 Valeur2 Relations Type de comparaison
1 0 0U == Nombre non signé
2 -1 0 < Nombre signé
3 -1 0U > Nombre non signé
4 2147483647 -2147483647-1 > Nombre signé
5 2147483647U -2147483647-1 < Nombre non signé
6 -1 -2 > Nombre signé
7 (unsigned)-1 -2 > Nombre non signé
8 2147483647 2147483648U < Nombre non signé
9 2147483647 (int)2147483648U > Nombre signé

Expliquez quelques - unes des conversions en comparaisons de nombres non signés :

-1 Converti en nombre non signé ,C'est devenu U M a x UMax ,Donc C'est plus grand que

-2147483647-1 - Oui. T M i n TMin ( Le but est de mettre en évidence l'asymétrie ), T M i n TMin Convertir en nombre non signé T M a x + 1 TMax+1 ,Par conséquent, T M a x TMax Grand.

Même chose.③

2.2.6 Étendre la représentation bitwise d'un nombre

Lorsque nous effectuons une conversion de type , Il arrive souvent que vous convertissez moins de chiffres en plus de chiffres , Mais nous ne voulons pas changer la valeur originale , C'est une extension de bits. .

Pour les nombres non signés,C'est très simple., Il suffit d'ajouter à gauche 0C'est tout..

Mais pour les nombres signés , Ce n'est pas un supplément 0C'est,Par exemple,,Il y a un4 Le nombre de bits est -5, Donc son complément est exprimé comme 1011, Nous voulons l'étendre à 8Bitwise, Si c'était juste un supplément 0,Alors ça devient0000 1011, Et la valeur de ce complément devient 11, C'est ce que nous ne voulons pas . Mais si c'est un nombre positif, ,Supplément0Pas de problème.,Pas d'exemple ici..

Alors pourquoi est - ce différent? ?

La raison en est que si le niveau le plus élevé était 1(Nombre négatif), Son poids est négatif , Et à gauche 0Après, Son poids devient positif .

Donc nous ne remplaçons pas à gauche 0, Au lieu de cela, ils sont tous complétés par des bits symboliques , La valeur est constante. , Ça semble un peu difficile à comprendre .

Nous expliquons intuitivement ,Supposons qu'il y ait unw Le complément négatif du BIT indique [ 1 , x w 2 , . . . , x 0 ] [1,x_{w-2},...,x_0] , Si vous étendez un bit à gauche , Il faut que sa valeur reste la même , On peut en rajouter un à gauche 1,Devenir [ 1 , 1 , x w 2 , . . . , x 0 ] [1,1,x_{w-2},...,x_0] . Pourquoi dire que la valeur est constante ? Parce que le Sommet précédent était 1,équivalent à 2 w 1 -2^{w-1} , L'extension devient 2 w 1 2^{w-1} , C'est - à - dire plus grand 2 w 2^{w} , Comment faire pour que ça reste le même? ,Moins 2 w 2^{w} Non, ça suffit,Moins 2 w 2^{w} En fait, il y en a un à gauche. 1Pas vrai?, Parce que le Supplément 1C'est à lawBits( Et c'est un bit de symbole ), Le poids est exactement 2 w -2^w .

L'exemple ci - dessus est une extension 1Bits, Vous pouvez trouver que les valeurs ne changent pas , Qu'en est - il de l'expansion des bits? , Il suffit d'utiliser l'induction mathématique ,C'est - à - dire:

[ 1 , x w 2 , . . . , x 0 ] = [ 1 , 1 , x w 2 , . . . , x 0 ] = [ 1 , 1 , 1 , x w 2 , . . . , x 0 ] = [ k - Oui. 1 , x w 2 , . . . , x 0 ] [1,x_{w-2},...,x_0]=[1,1,x_{w-2},...,x_0]=[1,1,1,x_{w-2},...,x_0]=[k- Oui.1,x_{w-2},...,x_0]

2.2.7 Tronquer les chiffres

C'est une extension. , L'inverse est tronqué. , C'est - à - dire que nous donnons un type de données plus grand à un type de données plus petit , C'est là que se produit la troncature ,Comme mettre unintAssigner une valeur àshort.

Pour les nombres non signés, En fait, j'ai fait une opération d'extraction de moisissures (mod),Unw Le nombre non signé de bits est tronqué à kBits, Est de garder le plus bas kBits, Et ensuite abandonner le haut ,Le résultat est w   m o d   2 k w \space mod \space 2^{k} .

Pour le complément , Un petit problème. , En fait, il reste le plus bas kBits, C'est - à - dire d'abord le traiter comme un nombre non signé , Ensuite, prenez le moule comme ci - dessus , C'est le plus bas kBits, Il suffit de le considérer comme un complément ,C'est - à - dire utiliser un U 2 T U2T La fonction convertit un nombre non signé en complément .

Par ici., On a fini la représentation des entiers. , Est - ce que ça a beaucoup profité .

2.3 Opérations entières

Et puis..., Parlons du fonctionnement des entiers , Au début de ce chapitre , Juste quelques exemples , Il montre que l'entier de l'ordinateur n'est pas exactement le même que l'entier réel , Il en va de même pour les opérations .En coursCAu moment de la procédure, Parfois, on trouve des résultats étranges , Comme deux nombres positifs ajoutés , Il s'avère que c'est un nombre négatif. . C'est ce qu'on appelle Débordement(overflow).

2.3.1 Addition non signée

Pour deuxwNombre non signé de bitsxEty,Oui.:

0 x < 2 w , 0 y < 2 w 0 x + y < 2 w + 1 0\le x < 2^w, 0\le y < 2^w \\ 0 \le x+y < 2^w+1

Vous pouvez voir que la valeur de deux nombres ajoutés peut dépasser 2 w 2^w ,C'est - à - dire, Ce nombre ne peut pas être exprimé en wNombre non signé de bits, De cette façon, le débordement produit . Mais nous devons le mettre dans wPosition médiane,C'est - à - dire2.2.7 Troncature décrite dans la Section , Donc le résultat réel serait ( x + y ) m o d 2 w (x+y)mod2^{w} , C'est comme ça que ça se passe. , Il y aura une falaise , Parce qu'une fois dépassé, le moule sera retiré. , Et ça redevient 0,Continuez à augmenter.

image-20220112202128942

Autrement dit,, C'est - à - dire lorsque le résultat de l'addition est supérieur ou égal à 2 w 2^w , Alors la somme réelle devient x + y 2 w x+y-2^w .

En adoptant ces conclusions ci - dessus , Nous pouvons également obtenir un algorithme pour détecter les débordements d'addition de nombres non signés : Si la somme de deux nombres non signés est plus petite que l'un d'eux (Moins dexOu moinsy) Alors il y a eu un débordement . La preuve est aussi simple , S'il n'y a pas eu de débordement , Donc certainement et plus grand que n'importe lequel de ces additions ;En cas de débordement, Donc la somme de l'addition s = x + y 2 w s=x+y-2^w ,Et y < 2 w y<2^w ,Alors y 2 w < 0 y-2^w<0 ,Et donc, s < x s<x .

2.3.2 Addition de complément

Six,y- Oui.wNombre signé de bits,Alors oui.:

2 w 1 x < 2 w 1 , 2 w 1 y < 2 w 1 2 w x + y < 2 w -2^{w-1}\le x < 2^{w-1},-2^{w-1}\le y < 2^{w-1} \\ -2^w\le x+y < 2^w

Encore une fois, Il y a aussi un risque de débordement . Mais il y a deux sortes de débordements ici ——Débordement positifEtRetombées négatives.

Pour un débordement positif , C'est juste que deux nombres positifs s'additionnent , Puis il a dépassé la plage des nombres positifs ,À ce moment - là., Le portage est ajouté au BIT de symbole , Laissez les bits de symbole de 0Devenir1, C'est devenu un nombre négatif. , C'est le genre de situation dont il est question au début de ce chapitre .

Au moment du débordement , Bits de symbole de 0Devenir1,Pour les nombres non signés,C'est1Ça représente 2 w 1 2^{w-1} , Mais c'est devenu 2 w 1 -2^{w-1} , Donc le résultat final est tout à fait x + y 2 w x+y-2^w .

Le débordement négatif, c'est - à - dire 1Est devenu0, Et c'est l'inverse , Va devenir un nombre positif , Le résultat final sera x + y + 2 w x+y+2^w .

Le résultat de l'utilisation d'un graphique pour représenter l'addition de complément est le suivant :

image-20220112204723714

2.3.3 Le complément n'est pas

La non - base du complément est ce qu'on appelle le nombre opposé , La raison fondamentale est , Voici un exemple ,C'est T M i n TMin ,Parce que pour T M i n TMin En ce qui concerne la formule suivante :

T M i n = T M i n -TMin=TMin

Alors..., Si pour un non 0 Entier signé de ,Pas nécessairement. x ! = x x!=-x ,Par exemple, T M i n TMin .

2.3.4 Multiplication non signée

Pour deuxwNombre non signé de bitsx,y, Si vous multipliez, il y aura un débordement. , L'analyse est similaire à l'addition de nombres non signés ci - dessus , Voici les conclusions :

x w u y = ( x y ) m o d 2 w x*_w^u y=(xy)mod2^w

2.3.5 Multiplication du complément

Pour deuxwNombre signé de bitsx,y, Le débordement de multiplication est similaire à l'analyse de l'addition de complément ci - dessus , Voici les conclusions :

x w u y = U 2 T w ( ( x y ) m o d 2 w ) x*_w^u y=U2T_w((xy)mod2^w)

C'est - à - dire multiplier d'abord comme un nombre non signé , Et puis tronquer , Conversion du complément de bits .

2.3.6 Multiplier par une constante

Sur la plupart des machines, La multiplication est lente , Plus ou moins 、 Les opérations au niveau des bits et les déplacements sont beaucoup plus lents ,Donc,,Le compilateur optimisera, Et la façon d'optimiser est d'utiliser une combinaison de déplacement et d'addition au lieu de multiplier par une constante .Pour les ordinateurs, Le déplacement est rapide , L'opération de déplacement est donc multipliée par 2 Une puissance entière ou divisée par 2Puissance entière de.Comme déplacer à gauche2Bits, C'est donc multiplié par 2 2 2^2 , Et à droite 2Bits, C'est comme ça qu'on divise 2 2 2^2 .

Par exemple,, Comme multiplier un nombre par 6, En fait, vous pouvez les multiplier par 2Et4,C'est - à - dire déplacer à gauche1Bits et2Bits, Puis additionnez les deux résultats , C'est - à - dire le multiplier par 6C'est. Voici deux exemples supplémentaires :

u << 3 == u * 8
(u << 5) – (u << 3) == u * 24
Copier le Code

2.3.7 Diviser par constante

Pour les machines , Multiplication et très lente , La Division est plus lente , Multiplication si nécessaire 3Cycles d'horloge, Alors la Division peut exiger 30 Cycles d'horloge ou plus , On peut aussi l'accélérer en le déplaçant . Pour la multiplication , Le déplacement est à gauche , Et pour la Division , Si c'est un nombre non signé , Utilisez le déplacement logique à droite pour , Si c'est un nombre signé , Un déplacement arithmétique est nécessaire .

Divisé par2 Division non signée de la puissance entière de :

Si 0 k < x , Et x > > k = x / 2 k Si0 \le k<x,Et x>>k=\lfloor x/2^k \rfloor

Divisé par2 Division complémentaire de la puissance entière de :

C'est un peu plus compliqué pour le complément , Parce que même avec un déplacement arithmétique à droite , Donc le résultat est arrondi vers le bas , Mais pour les nombres négatifs , Le résultat dont nous avons besoin est de 0Arrondi,Par exemple,-3.14, Nous Arrondissons toujours à -3. Mais regardez l'exemple suivant ,Et nous pouvons voir, Nous Arrondissons toujours vers le bas lorsque l'arithmétique se déplace à droite .

image-20220112232029927

Et donc,, Nous ajoutons habituellement un décalage , Pour corriger cette arrondie .

Principes:

Pour les entiers x Et y ( y > 0 ) , x / y = ( x + y 1 ) / y Pour les entiersxEty(y>0),\lceil x/y\rceil =\lfloor(x+y-1)/y\rfloor

Et donc,,Utiliser les propriétés ci - dessus, Nous pouvons utiliser l'équation suivante pour diviser un nombre négatif :

( x + ( 1 < < k ) 1 ) > > k = x / 2 k (x+(1<<k)-1)>>k=\lceil x/2^k\rceil

Alors, pour résumer,On peut utiliser unC Division des expressions pour compléter les codes x / 2 k x/2^k

(x < 0 ? (x + (1<<k) - 1) : x) >> k
Copier le Code

2.3.8 Un résumé des entiers

Enfin,Nous pensons à quelques questions.

Tout d'abord,, Pourquoi un entier non signé est nécessaire , Au lieu d'utiliser tous les compléments , C'est parce que parfois , Nous n'avons vraiment pas besoin d'un complément , Parce qu'il n'y a pas de nombre négatif , Et l'utilisation d'entiers non signés peut tripler la portée de la représentation ,Parce queC Entier non signé réservé .

Mais, Il y a beaucoup de choses qui arrivent quand on utilise des entiers non signés bug, Ceci est dû au fait que le complément est utilisé par défaut , Et quand le complément fonctionne avec le non - symbole, il est converti , Encore une fois, ces erreurs sont difficiles à détecter. .

Un programme comme celui - ci :

unsigned i;
for (i = cnt-2; i >= 0; i--)
a[i] += a[i+1];
Copier le Code

Réfléchis un peu,Que se passe - t - il?,Facile à trouver, Ce cycle ne s'arrêtera jamais. ,Parce quei C'est un entier non signé , Quand il sera réduit à 0Et puis moins1,Est redevenu U M a x UMax ,Et utilisera Quand on fait une citation , Il y a un risque d'erreur de segmentation ,Parce que U M a x UMax C'est trop grand, Hors de portée de la référence .

Par ici., On en a fini avec les entiers ,Et puis..., Parlons d'un autre nombre important ——Nombre de points flottants.

2.4 Nombre de points flottants

La représentation d'un nombre flottant dans un ordinateur est similaire à celle d'un comptage scientifique dans la réalité ,Pour la forme V = x × 2 y V=x\times 2^y Le nombre rationnel de .

Jusqu'à20Le siècle80Âge, De nombreux fabricants d'ordinateurs ont conçu leurs propres règles de représentation flottante , Ça a causé un peu de confusion ,Jusqu'àIEEE 754 Lancement de la norme , Il y a une norme unifiée . Nous vous présentons dans ce chapitre IEEE Cette norme flottante .

2.4.1 Décimales binaires

Pour les entiers, Nous savons que le poids de chacun est en fait 2Puissance intégrale de( Puissance intégrale positive ), Et pour les décimales, , Est en fait devenu une puissance intégrale négative .

Pour un b m b m 1 . . . b 0 . b 1 b 2 . . . b n b_mb_{m-1}...b_0.b_{-1}b_{-2}...b_{-n} La décimale de, Les poids de chacun à droite du point décimal sont respectivement -1,-2,-3 Attendez, tout droit . Et la valeur de tout le nombre de points flottants est :

b = Σ i = n m b i × 2 i b=\Sigma_{i=-n}^{m}b_i\times2^i

En fait, Il n'est pas possible de représenter exactement beaucoup de décimales de cette façon , On ne peut faire que des approximations , Et l'augmentation du nombre de chiffres peut augmenter le degré d'approximation .

La représentation ci - dessus , Ça s'appelle une représentation fixe , C'est - à - dire que la position du point décimal est fixe , Et stocker tous les bits . Par exemple, nous stockons 1011 1001 0111 0101,C'est possible.1011 1001.0111 0101.

On peut le découvrir., Si vous utilisez une représentation ponctuelle , La portée de la représentation est donc très limitée . Parce que la partie entière ne peut contenir que quelques chiffres , Il en va de même pour les décimales , On peut faire une analogie , Si vous écrivez directement une décimale ,Par exemple,1234.5678,Utilisé8Nombre de chiffres, Et si nous utilisons le comptage scientifique ,Par exemple, 1 × 1 0 10 1\times10^{10} , On a juste besoin d'une base , Et un indice , Cela représente un grand nombre , La portée est beaucoup plus grande .Et donc,,Nous allons vous présenterIEEELe point flottant représente.

2.4.2 IEEEReprésentation en virgule flottante

IEEEUtiliser V = ( 1 ) s × M × 2 E V=(-1)^s\times M\times2^E ,Parmi eux,sPourBits de symbole(sign),MPourLes derniers chiffres(mantissa Ou aussi appelé significant,a fractional value),EPourCode d'ordre(exponent), Ou vous pouvez le comprendre comme un indice .

Attention!,Dans la figure ci - dessousexp Pas égal au Code d'ordre ,frac Ce n'est pas la même chose que la queue. , C'est parce que le Code d'ordre est en fait exp La valeur de moins un élément offset , La queue est en fait par défaut à 1.Au début, Ensuite, suivez frac. On en parlera plus tard. .

image-20220113000127272

Il y a trois sortes de nombres flottants :Précision simpleDouble précisionEtPrécision étendue(Rarement utilisé).

Précision simpleTotal32Bits,Utiliser1Symbole bits bits,8Code d'ordre du BIT,23 Fin du BIT .

image-20220113000356123

Double précisionTotal64Bits,Utiliser1Symbole bits bits,11 Le Code d'ordre des bits et 52 Fin du BIT .

image-20220113000617771

Précision étendueTotal80Bits,Utiliser1Symbole bits bits,15 Le Code d'ordre des bits et 64 Fin du BIT .(SeulementIntelEn service)

image-20220113000627656

Le codage peut être basé sur expEtfrac Il y a trois types de valeurs pour (Ou quatre, Démonter le troisième en 2- Oui.)La situation, Les deux derniers sont destinés à indiquer des circonstances particulières , La normalisation est notre décimale normale , Au lieu d'être normalisé, il est utilisé pour représenter 0 Nombre à proximité .

  • Standardisé :expNon.0Ou255. Utilisé pour représenter une décimale générale image-20220113001130663
  • Non normalisé :expPour0.Utilisé pour représenter0Et près de0Nombre de image-20220113001147494
  • Infini:expPour255,EtfracPour0. Utilisé pour représenter l'infini image-20220113001206224
  • NaN:expPour255,EtfracNon.0.Utilisé pour représenterNot a Number image-20220113001217802

Et puis..., On en discute un par un :

Un.、 Valeurs normalisées

image-20220113001130663

Dans ce cas, Le Code d'ordre est exp La valeur de moins un décalage ,C'est - à - dire: E = e B i a s E=e-Bias ,Parmi euxeOui.exp Le motif de bits est considéré comme un nombre non signé ,SiexpPourkBits,AlorsBiasC'est 2 k 1 1 2^{k-1}-1 , Comme une seule précision expPour8Bits,AlorsBiasC'est 2 8 1 1 = 127 2^{8-1}-1=127 , Et la double précision est 11Bits,AlorsBiasC'est 2 11 1 1 = 1023 2^{11-1}-1=1023 .C'est - à - dire, J'aurais dû. exp Comme un nombre non signé , La plage de représentation de la précision unique normalisée est 1À254, Et moins un BiasAprès, La portée devient -126À127,La double précision est-1022À1023.

Et pour les queues M,En fait,M=1+f, Ce qui veut dire qu'il y a une implication 1,Sif Le mode BIT pour est f n 1 , f n 2 , . . . , f 0 f_{n-1},f_{n-2},...,f_0 ,Alors oui.: M = 1. f n 1 f n 2 . . . f 0 M=1.f_{n-1}f_{n-2}...f_0 , Donc les derniers chiffres M La gamme de [ 1.0 , 2.0 ) [1.0,2.0) . Et la raison pour laquelle nous avons 1, C'est parce qu'on a toujours 1.Au début, Donc vous n'avez pas besoin de stockage , Il y a donc un peu plus de stockage .

2.、Valeur non normalisée

image-20220113001147494

Pourquoi des valeurs non normalisées sont - elles nécessaires? , Supposons que nous utilisions tous une approche normalisée (AllowexpPour0), Donc le plus petit nombre absolu est E = 127 , M = 1.0 E=-127,M=1.0 Quand,C'est - à - dire 1.0 × 2 127 1.0\times2^{-127} , Même si c'est très proche 0C'est, Mais ça ne veut pas dire 0, Nous avons donc adopté des valeurs non normalisées (expTout est0Situation).À ce moment - là., Nous définissons les codes d'ordre E = 1 B i a s E=1-Bias ,Et le nombre de queues M = f M=f ,À ce moment - là.,frac Peut être considéré comme une queue , Et il n'y a pas de 1. Ça ne veut pas dire 0 La raison en est que les queues ont toujours une implication 1, Donc, dans la représentation non normalisée, la queue est définie comme fC'est très raisonnable.

Alors pourquoi la définition du Code d'ordre n'est pas utilisée comme dans la normalisation e-Bias,Et en ce momentePour0,Et donc, E = B i a s E=-Bias Et alors??

La raison en est que nous voulons passer en douceur d'une valeur non normalisée à une valeur normalisée , Permet une distribution uniforme des valeurs 0. Comprendre intuitivement , Notre plus petite valeur normalisée est expPour00...01,Alors E = 1 B i a s E=1-Bias ,EtfTout est0,À ce moment - là.M=1.0, En utilisant la non - normalisation ,M La valeur maximale de MUn peu plus petit,C'est - à - dire0.111...,On va juste laisserE Conforme au minimum normalisé ,C'est - à - dire 1 B i a s 1-Bias , Cela garantit une transition sans heurt de la normalisation à la non - normalisation , Si c'est inimaginable ici , Nous utiliserons un exemple simple pour aider à comprendre .

Trois、Valeurs spéciales

Parfois..., Nous avons besoin de valeurs spéciales ,Par exemple,Infini,EtNon numérique(Not a Number).

  • Infini
    • C'est infini
    • Infini négatif

image-20220113001206224

QuandexpTout est1Quand, Nous pensons que c'est l'infini ,SisPour0 C'est l'infini positif ,Si oui1, Est négatif infini .En d'autres termes,, Quand l'indice atteint la limite supérieure (Tous1),EtfracTous.0Quand, Nous pensons que c'est le plus grand nombre , Bien sûr, cette valeur n'a pas de sens spécifique , C'est juste une règle .

  • Non numérique

image-20220113001217802

Beaucoup de fois, Nous obtenons des valeurs non réelles ,Comme le calcul 1 \sqrt{-1} Un nombre négatif sous ce type de racine , Nous obtenons des solutions complexes en mathématiques , Mais pour les ordinateurs, , C'est un non - nombre (Not a Number), Nous devons donc également exprimer cette situation .C'est pourquoi nous avons prescrit,QuandexpTout.1,EtfracNon.0Quand,Juste un.NaN.

2.4.3 Exemple numérique

Il y a peut - être des abstractions. , Prenons deux exemples ,Bien sûr.,Nous n'utiliserons pas32Bitwise, C'est trop compliqué ,On va commencer.6 Le nombre flottant de bits représente ,Code d'ordre moyen3Bits,Les derniers chiffres2Bits. Donc le décalage B i a s = 2 3 1 1 = 3 Bias=2^{3-1}-1=3 . Après avoir dessiné ces valeurs qui peuvent être représentées sur l'axe des nombres ,Nous pouvons observer, Plus loin. 0Approche., Plus les points sont denses , Et l'espacement entre certains points est le même . C'est parce que notre indice change , Et plus on s'approche de plus en plus , Plus l'indice est grand , Cela signifie que plus l'espacement entre les deux points est grand , Parce que quand l'indice est le même , La différence entre deux points est égale à la différence de leur fraction décimale multipliée par cet indice .C'est - à - dire, Quand l'indice est le même , L'espacement entre ces points est le même .

image-20220113143434793

Voyons un autre8Exemple de bits,Code d'ordre moyen4Bits,Les derniers chiffres3Bits. Donc le décalage B i a s = 2 4 1 1 = 7 Bias=2^{4-1}-1=7 . Montre le tableau ci - dessus. 3Nombre de classes:

image-20220113144933263

Nous avons déjà parlé de , Afin de permettre une transition en douceur du nombre non normalisé au nombre normalisé ,C'est ainsi que E = 1 B i a s E=1-Bias , D'après le tableau ci - dessus, nous pouvons voir que , L'intervalle entre le plus grand nombre non normalisé et le plus petit nombre normalisé et l'intervalle entre le nombre non normalisé sont égaux .

2.4.4 Arrondi

Comme la gamme des nombres flottants est également limitée , Pour une seule précision, il n'y a que 32Bits, Pour la double précision, c'est 64Bits,Donc,, Nous sommes également confrontés au problème de l'arrondissement , Il y a en fait plusieurs façons d'arrondir :

  • Arrondir au nombre pair: Arrondi au plus proche
  • Arrondir à zéro :C'est - à - dire vers0 Trouver la valeur la plus proche ( Un nombre positif pour un petit , Le nombre négatif cherche le plus grand ).
  • Arrondi vers le bas: C'est la valeur la plus proche vers le bas ( Trouvez un plus petit ).
  • Arrondi vers le Haut: C'est - à - dire chercher la valeur la plus proche vers le Haut ( Trouvez un plus grand ).

image-20220113150018256

Par défaut, nous utilisons l'arrondi à un nombre pair , Ou il est aussi appelé arrondi à la valeur la plus proche .Bien sûr., Nous résumons aussi souvent par une phrase qui est arrondie à l'arrondi et laissée en double , Ensuite, expliquons un peu .

Par exemple, nous avons un nombre 7.8949999, On ne peut garder qu'après la décimale 2Bits, Les autres à abandonner , Si l'arrondi pair est utilisé , Donc la troisième décimale est 4, Pour trouver le plus proche ,C'est7.89.Si oui7.8950001 , Alors nous arrondirons à 7.90, C'est cinq paires. ,Si conservé7.89, Donc le BIT le moins significatif est impair , Et nous exigeons un double , Alors choisissez le plus proche 7.90.Encore une fois,Si oui7.8850000, Alors gardez - en deux comme ci - dessus. ,C'est devenu7.88.

Ce sont des exemples de décimales ,Alors si c'estBinaireEt toi?? Le binaire est plus facile à juger , Parce que soit 0Ou bien1,Pour0 Nous devons abandonner ,Et pour1, J'ai suivi les instructions ci - dessus. ,Parce que binaire1 En fait, en décimal 2La moitié de, En décimale, c'est comme en décimale 0.5.

On va arrondir à la décimale 2Bits,Pour 10.0001 1 2 10.00011_2 , On a trouvé que la troisième était 0, Alors va - t'en. ,Devenir 10.0 0 2 10.00_2 .Pour 10.0011 0 2 10.00110_2 , Parce qu'il reste deux ,Alors c'est 10.0 0 2 10.00_{2} .Si oui 10.1110 0 2 10.11100_2 , Alors, mets - toi ,Devenir 11.0 0 2 11.00_2 .

L'arrondissement est terminé ,C'est plus simple..

2.4.5 Opérations en virgule flottante

Multiplication flottante

La multiplication des points flottants est plus simple ,Réfléchis un peu, Est - ce que le comptage scientifique décimal est assez simple pour commencer la multiplication , Et les deux sont similaires .

( 1 ) s 1 M 1 2 E 1 × ( 1 ) s 2 M 2 2 E 2 = ( 1 ) s M 2 E Parmi eux, s = s 1 XOR s 2 , M = M 1 × M 2 , E = E 1 + E 2 (–1)^{s1} M_1 2^{E_1} \times (–1)^{s2} M_2 2^{E_2}=(–1)^{s} M 2^{E} \\ Parmi eux,s=s1XORs2,M=M_1\times M_2,E=E_1+E_2

Parce que M 1 × M 2 M_1\times M_2 Apparemment plus grand que 2De,Par exemple, 1. 1 2 × 1. 1 2 1.1_2\times1.1_2 C'est plus grand que ça.2C'est, Donc nous devons déplacer les résultats à droite ,Et aprèsEAjouter1.En même temps,M La précision doit également être maintenue en arrondissant .

Addition flottante

Avec l'addition flottante , Il faut d'abord aligner le point décimal , La façon d'aligner les points décimaux est de déplacer à gauche et à droite , Si vous déplacez à gauche, soustrayez le Code d'ordre du nombre de bits correspondant. , C'est l'inverse . Nous avons deux alignements , L'un est d'aligner les grands exposants sur les petits exposants ,L'autre est le contraire.,Mais en général,, Nous choisissons d'aligner les petits exposants sur les grands ,L'un d'eux est2De12Secondaire,L'un est2De10Secondaire, Nous choisissons de changer la queue de ce dernier (À droite.2Bits), Et l'indice devient 12.

Cet alignement a été choisi parce que , Si vous mettez le plus petit sur le plus grand , Même s'il y a une petite perte de précision , Mais une telle erreur serait mineure .

L'inverse est différent , Si vous mettez le plus gros sur le plus petit , Les queues peuvent devenir grandes. , Quand les derniers chiffres sont ajoutés , Possibilité de débordement , Il est donc possible que les nombres positifs deviennent négatifs , C'est intolérable. .

2.4.6 CNombre de points flottants dans la langue

PourCEn termes de langue, La conversion de points flottants et d'autres types de données peut produire des conditions inattendues ,Voyons quelques exemples.:

HypothèsesxPourint,yPourfloat,dPourdouble,Jugement Voyons si ça marche. :

  • x == (int)(float) x Non,Parce quefloatDefracEn partie seulement23Bits,EtintOui.32Bits
  • x == (int)(double) x - Oui.,Parce quedoubleDefracOui.52Bits
  • f == (float)(double) f - Oui.
  • d == (double)(float) d Non
  • f == -(-f) - Oui.
  • 2/3 == 2/3.0 Non,Le premier est0, Ce dernier est une opération flottante .
  • d < 0.0 ⇒ ((d*2) < 0.0) - Oui., Même si le débordement devient négatif ,Est également inférieur à0
  • d > f ⇒ -f > -d - Oui.
  • d * d >= 0.0 - Oui.
  • (d+f)-d == f Non, Il n'y a pas de loi de combinaison pour l'addition de nombres flottants , Peut - être en raison de problèmes de précision fVa - t'en.,Le résultat est0.

C'est tout ce qu'il y a dans le chapitre deux ~

本文为[Howard 496]所创,转载请带上原文链接,感谢
https://fheadline.com/2022/01/202201142248429688.html
相似文章