Comprenez-vous le code d'origine, le code inverse et le code complémentaire dans la programmation en langage C ?

1. Numéros de machine et valeurs de vérité

Avant d'apprendre le code d'origine, le code inverse et le code complémentaire, vous devez comprendre les concepts de nombres de machines et de valeurs de vérité.

1. Nombre de machines

La représentation binaire d'un nombre dans un ordinateur est appelée le numéro de machine du nombre. Le numéro de machine est signé et le bit le plus élevé d'un nombre est utilisé pour stocker le signe dans l'ordinateur, le nombre positif est 0 et le nombre négatif est 1.

Par exemple, le nombre +3 en décimal, la longueur du mot informatique est de 8 bits et converti en binaire est 00000011. Si c'est -3, c'est 10000011.

Ensuite, 00000011 et 10000011 voici les numéros de machine.

2. Vraie valeur

Comme le premier bit est le bit de signe, la valeur formelle du numéro de machine n'est pas égale à la valeur réelle. Par exemple, dans le nombre signé ci-dessus 10000011, le bit le plus élevé 1 représente le négatif et sa valeur réelle est -3 au lieu de la valeur formelle 131 (10000011 converti en décimal est égal à 131). Ainsi, par souci de distinction, la valeur réelle correspondant au numéro de machine avec le bit signé est appelée valeur réelle du numéro de machine.

Exemple : valeur vraie de 0000 0001 = +000 0001 = +1, valeur vraie de 1000 0001 = –000 0001 = –1

2. Concepts de base et méthodes de calcul du code original, du code inverse et du code complémentaire.

Avant d'explorer pourquoi la machine utilise le code complément, comprenons d'abord le concept du code original, le code complément et le code complément. Pour un nombre, l'ordinateur doit utiliser une certaine méthode de codage pour stocker. Le code original, code complément , et le code complémentaire sont un stockage machine Une méthode de codage pour un nombre spécifique.

1. Code d'origine

Le code d'origine est la valeur absolue du bit de signe plus la valeur vraie, c'est-à-dire que le premier bit est utilisé pour représenter le signe et les bits restants représentent la valeur. Par exemple, s'il s'agit d'un binaire 8 bits :

[+1] Original = 0000 0001

[-1] d'origine = 1000 0001

Le premier bit est le bit de signe. Étant donné que le premier bit est le bit de signe, la plage de valeurs du nombre binaire 8 bits est :

[1111 1111 , 0111 1111]

Tout de suite

[-127 , 127]

Le code original est la représentation la plus facile à comprendre et à calculer pour le cerveau humain.

2. Code inverse

La méthode de représentation inverse est :

Le complément à un d'un nombre positif est lui-même

Le code inverse d'un nombre négatif est basé sur le code d'origine, le bit de signe reste inchangé et le reste des bits est inversé.

[+1] = [00000001] Original = [00000001] Anti

[-1] = [10000001] d'origine = [11111110] anti

On peut voir que si un code négatif représente un nombre négatif, le cerveau humain ne peut pas voir intuitivement sa valeur. Habituellement, il doit être converti dans le code original avant le calcul.

3. Code complémentaire

La notation en complément à deux est :

Le complément d'un nombre positif est lui-même

Le code complémentaire d'un nombre négatif est basé sur le code d'origine, le bit de signe reste inchangé et le reste des bits est inversé, et enfin +1.(C'est-à-dire +1 sur la base du code complémentaire)

[+1] = [00000001] original = [00000001] inverse = [00000001] complément

[-1] = [10000001] original = [11111110] inverse = [11111111] complément

Pour les nombres négatifs, la représentation du code complémentaire est également impossible pour le cerveau humain de voir intuitivement la valeur. Habituellement, il doit être converti dans le code d'origine pour calculer la valeur.

3. Pourquoi utiliser le code original, le code inverse et le code complémentaire

Avant de commencer une étude approfondie, ma suggestion d'apprentissage est de "mémoriser par cœur" le code original ci-dessus, le code inverse et la représentation du code complémentaire et la méthode de calcul.

Nous savons maintenant que l'ordinateur peut exprimer un nombre de trois manières de codage. Pour les nombres positifs, les résultats des trois méthodes de codage sont les mêmes :

[+1] = [00000001] original = [00000001] inverse = [00000001] complément

Donc pas besoin de trop expliquer, mais pour les nombres négatifs :

[-1] = [10000001] original = [11111110] inverse = [11111111] complément

On peut voir que le code original, le code inverse et le code complémentaire sont complètement différents.Puisque le code original est directement reconnu par le cerveau humain et utilisé pour calculer l'expression, pourquoi y a-t-il encore du code inverse et du code complémentaire ?

Tout d'abord, parce que le cerveau humain peut savoir que le premier bit est le bit de signe, nous choisirons l'addition et la soustraction de la zone de valeur vraie en fonction du bit de signe lors du calcul. (Le concept de valeur vraie est au début de cet article). Mais pour les ordinateurs, l'addition et la soustraction La multiplication est déjà l'opération la plus élémentaire, et elle doit être conçue aussi simple que possible. L'identification par l'ordinateur du "bit de signe" rendra évidemment la conception de base du circuit de l'ordinateur très compliquée. ! Les gens ont donc trouvé une méthode pour utiliser le bit de signe pour participer à l'opération. Nous savons que, selon l'algorithme, soustraire un nombre positif équivaut à ajouter un nombre négatif, à savoir : 1-1 = 1 + (-1 ) = 0 , de sorte que la machine ne peut qu'additionner mais pas soustraire, de sorte que la conception des opérations informatiques est plus simple.

Les gens ont donc commencé à explorer la méthode consistant à utiliser le bit de signe pour participer à l'opération et à ne conserver que l'ajout.Regardez d'abord le code d'origine :

Calculez l'expression décimale : 1-1=0

1 - 1 = 1 + (-1) = [00000001] brut + [10000001] brut = [10000010] brut = -2

S'il est représenté par le code d'origine, et que le bit de signe intervient également dans le calcul, évidemment pour la soustraction, le résultat est incorrect, c'est pourquoi l'ordinateur n'utilise pas le code d'origine pour représenter un nombre.

Afin de résoudre le problème de la soustraction du code d'origine, il existe un code inverse :

Calculez l'expression décimale : 1-1=0

1 - 1 = 1 + (-1) = [0000 0001] d'origine + [1000 0001] d'origine = [0000 0001] d'origine + [1111 1110] d'origine = [1111 1111] d'origine = [1000 0000] d'origine = -0

On constate que la valeur de vérité du résultat est correcte lors de l'utilisation de son complément pour calculer la soustraction. Le seul problème est en fait la valeur spéciale "0". Bien que les gens comprennent que +0 et -0 sont les mêmes, mais 0 a un signe Cela n'a pas de sens. Et il y aura [0000 0000] original et [1000 0000] deux codes originaux pour représenter 0.

Ainsi l'émergence du code complément résout le problème du signe de 0 et des deux codages :

1-1 = 1 + (-1) = [0000 0001] original + [1000 0001] original = [0000 0001] complément + [1111 1111] complément = [0000 0000] complément = [0000 0000] original

De cette façon, 0 est représenté par [0000 0000], et le -0 qui avait des problèmes auparavant n'existe pas. Et il peut être représenté par [1000 0000] -128 :

(-1) + (-127) = [1000 0001] original + [1111 1111] original = [1111 1111] complément + [1000 0001] complément = [1000 0000] complément

Le résultat de -1-127 devrait être -128. Dans le résultat de l'opération de code complément, [1000 0000] complément est -128. Mais notez que parce que le code complément -0 précédent est en fait utilisé pour représenter -128, donc- 128 n'a pas de code d'origine et de représentation de code inverse. (La représentation du code complémentaire de -128 [1000 0000] complète le code d'origine est [0000 0000] code d'origine, ce qui est incorrect)

En utilisant le code complémentaire, non seulement corrige le signe de 0 et le problème de deux codages, mais peut également exprimer un nombre minimum. C'est pourquoi la plage de binaire 8 bits, en utilisant le code d'origine ou le code inverse, est [-127, + 127], tandis que la plage représentée par le complément à deux est [-128, 127].

Parce que la machine utilise le code complément, donc pour le type int 32 bits couramment utilisé en programmation, la plage qui peut être représentée est : [-231, 231-1] car le premier bit représente le bit de signe. Et lors de l'utilisation du code complément représentation, il peut y en avoir plus Enregistrez une valeur minimale.

4. Code original, code inverse, code complémentaire puis aller plus loin

L'ordinateur utilise intelligemment le bit de signe pour participer à l'opération, et transforme la soustraction en addition. Quel genre de principe mathématique est derrière cela ?

Considérez une horloge comme un nombre hexadécimal à 1 chiffre. Si l'heure actuelle est 6 heures et que je souhaite régler l'heure sur 4 heures, que dois-je faire ? Nous pouvons :

1. Composez 2 heures en arrière : 6 - 2 = 4

2. Composez en avant 10 heures : (6 + 10) mod 12 = 4

3. Composez avant 10+12=22 heures : (6+22) mod 12 =4

Le mod dans la méthode 2,3 fait référence à l'opération de module, 16 mod 12 = 4 signifie que le reste après avoir divisé 16 par 12 est 4.

Ainsi, le résultat du retour de l'horloge (soustraction) peut être remplacé par un avancement (addition) !

Maintenant, l'accent est mis sur la façon de remplacer un nombre négatif par un nombre positif. Dans l'exemple ci-dessus, nous pouvons ressentir des indices et découvrir certaines lois. Mais les mathématiques sont rigoureuses et nous ne pouvons pas nous fier aux sentiments.

Introduisez d'abord un concept connexe en mathématiques : la congruence

notion de congruence

Deux entiers a, b, s'ils divisent le reste par l'entier m sont égaux, alors a, b sont dits congruents modulo m

Ecrire a ≡ b (mod m)

Lu comme a et b congrus modulo m.

Par exemple:

4 mod 12 = 4

16 mod 12 = 4

28 mod 12 = 4

donc:

7 ≡ 7 (mode 12)

(-2) ≡ 10 (module 12)

7 -2 ≡ 7 + 10 (mode 12)

Maintenant, nous trouvons son nombre congruent positif pour un nombre négatif.Mais ce n'est pas 7-2 = 7+10, mais 7 -2 ≡ 7 + 10 (mod 12), c'est-à-dire que le reste du résultat du calcul est égal.

Ensuite, revenons au problème du binaire, regardons-le : le problème de 2-1=1.

2-1=2+(-1) = [0000 0010] brut + [1000 0001] brut = [0000 0010] inverse + [1111 1110] inverse

Venez d'abord à cette étape, le code inverse de -1 signifie 1111 1110. Si [1111 1110] est considéré comme le code d'origine ici, alors le code d'origine de [1111 1110] = -126, et le bit de signe est supprimé ici, c'est-à-dire qu'il est considéré comme 126.

Les règles suivantes ont été trouvées :

(-1) module 127 = 126

126 mod 127 = 126

Tout de suite:

(-1) ≡ 126 (module 127)

2-1 ≡ 2+126 (mode 127)

2-1 est le même que le reste de 2+126 ! Et ce reste est le résultat du calcul de notre attente : 2-1=1

Par conséquent, le code inverse d'un nombre est en fait le nombre congruent de ce nombre par rapport à une membrane. Et cette membrane n'est pas notre système binaire, mais la valeur maximale qui peut être représentée ! Une valeur correcte dans la plage représentable peut être trouvée !

Et 2 + 126 équivaut évidemment à un tour d'horloge, et comme le bit de signe est impliqué dans le calcul, il arrive qu'il forme le résultat de l'opération correcte avec le bit de dépassement le plus élevé.

Étant donné que le code complémentaire peut transformer une soustraction en addition, qu'en est-il du code complémentaire utilisé par les ordinateurs actuellement ? Pourquoi l'ajout de 1 au code complémentaire peut-il encore obtenir le résultat correct ?

2-1=2+(-1) = [0000 0010] original + [1000 0001] original = [0000 0010] complément + [1111 1111] complément

Si [1111 1111] est considéré comme le code d'origine et que le bit de signe est supprimé, alors :

[0111 1111] D'origine = 127

En fait, +1 sur la base du code inverse équivaut juste à augmenter la valeur de la membrane :

(-1) module 128 = 127

127 mod 128 = 127

2-1 ≡ 2+127 (module 128)

À ce moment, le cadran équivaut à tourner une fois toutes les échelles 128. Par conséquent, les valeurs minimales et maximales des résultats de l'opération exprimées en code complémentaire doivent être [-128, 128].

Mais en raison du cas particulier de 0, il n'y a aucun moyen de représenter 128, donc la plage de valeurs du code complément est [-128, 127]

Regardez-moi pour un ensemble complet de matériel de code source : 725022484 Allez sur l'espace personnel de Xiaoyu-Allez allez sur la page d'accueil personnelle de Xiaoyu-哔哩哔哩Vidéo哔哩哔里 Allez sur l'espace personnel de Xiaoyu, fournissez Xiaoyu Allez et partagez Pour les vidéos , audios, articles, dynamiques, favoris et autres contenus, suivez le compte Xiaoyu Come et soyez le premier à connaître la dynamique d'UP. Groupe d'apprentissage de la programmation : 725022484 Partagez un petit jeu de programmation tous les jours ~ Matériel de code source du jeu C/C++ et divers packages d'installation, les messages privés ne sont pas souvent vus ! https://space.bilibili.com/1827181878?spm_id_from=333.788.0.0

Je suppose que tu aimes

Origine blog.csdn.net/yx5666/article/details/129086086
conseillé
Classement