Pourquoi préférer le complément à deux au signe et à l'ampleur pour les numéros signés?

201

Je suis juste curieux de savoir s'il y a une raison pour laquelle pour représenter -1 en binaire, le complément à deux est utilisé: retourner les bits et ajouter 1?

-1 est représenté par 11111111 (complément à deux) plutôt que (pour moi plus intuitif) 10000001 qui est binaire 1 avec le premier bit comme drapeau négatif.

Avertissement: je ne compte pas sur l'arithmétique binaire pour mon travail!

Rayon
la source
6
FWIW, votre méthode «intuitive» d'utilisation d'un bit de signe est utilisée occasionnellement - par exemple, la plupart des ordinateurs utilisent un bit de signe pour représenter des nombres à virgule flottante.
Adisak
2
@Adisak Ça s'appelle grandeur signée
Cole Johnson
2
J'ai toujours associé la représentation du signe et de l'amplitude aux nombres entiers, car les nombres à virgule flottante contiennent trois composants: un signe, un exposant et une mantisse (souvent avec un «1» implicite). Mais je suppose qu'il est assez facile de traiter l'exposant et la mantisse comme une ampleur tant que l'on se rend compte qu'ils ne sont pas strictement linéaires.
Adisak
Voici un article expliquant comment les nombres à virgule flottante sont stockés en binaire, pour ceux qui sont curieux des remarques de @ Adisak.
GDP2
Je viens de voir une belle vidéo expliquant ce youtube.com/watch?v=dHB7jFjESLY
allenlinli

Réponses:

333

C'est fait pour que l'addition n'ait pas besoin d'avoir de logique spéciale pour traiter les nombres négatifs. Consultez l'article sur Wikipédia .

Disons que vous avez deux nombres, 2 et -1. Dans votre manière "intuitive" de représenter les nombres, ils seraient 0010et 1001, respectivement (je m'en tiens à 4 bits pour la taille). À la manière du complément à deux , ils sont 0010et 1111. Maintenant, disons que je veux les ajouter.

L'ajout de complément à deux est très simple. Vous ajoutez des nombres normalement et tout bit de fin à la fin est rejeté. Ils sont donc ajoutés comme suit:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 est 1, ce qui est le résultat attendu de "2 + (- 1)".

Mais dans votre méthode "intuitive", l'ajout est plus compliqué:

  0010
+ 1001
= 1011

Quel est -3, non? L'ajout simple ne fonctionne pas dans ce cas. Vous devez noter que l'un des nombres est négatif et utiliser un algorithme différent si tel est le cas.

Pour cette méthode de stockage "intuitive", la soustraction est une opération différente de l'addition, nécessitant des vérifications supplémentaires sur les nombres avant de pouvoir les ajouter. Puisque vous voulez que les opérations les plus élémentaires (addition, soustraction, etc.) soient aussi rapides que possible, vous devez stocker les nombres de manière à vous permettre d'utiliser les algorithmes les plus simples possibles.

De plus, dans la méthode de stockage "intuitive", il y a deux zéros:

0000  "zero"
1000  "negative zero"

Qui sont intuitivement le même nombre mais ont deux valeurs différentes lors de leur stockage. Chaque application devra prendre des mesures supplémentaires pour s'assurer que les valeurs non nulles ne sont pas non plus un zéro négatif.

Il y a un autre avantage à stocker les ints de cette façon, et c'est à ce moment-là que vous devez étendre la largeur du registre dans lequel la valeur est stockée. bit le plus significatif:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

Il suffit de regarder le bit de signe du petit mot et de le répéter jusqu'à ce qu'il remplisse la largeur du plus gros mot.

Avec votre méthode, vous devrez effacer le bit existant, ce qui est une opération supplémentaire en plus du remplissage:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Vous devez toujours définir ces 4 bits supplémentaires dans les deux cas, mais dans le cas "intuitif", vous devez également effacer le 5e bit. Il s'agit d'une toute petite étape supplémentaire dans l'une des opérations les plus fondamentales et les plus courantes de chaque application.

Welbog
la source
13
Je suis d'accord. Le complément de 2 fonctionne. Mais comment en sommes-nous arrivés là en premier lieu? Si je suppose que j'ai besoin d'arriver à cette notation, quel serait le processus de pensée. Je pense qu'arriver au complément de 2 doit être plus que de la chance, n'est-ce pas?
Lazer
1
De plus, pourquoi n'y a-t-il pas d'équivalent complément 2 pour les flotteurs?
Lazer
6
@Lazer consultez cet article pour connaître how we arrived at 2s compliment the first place. cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
Ankit
1
Pour autant que je sache, Java n'a signé que des types entiers, il le traite donc toujours dans son complément à deux. Dans d'autres langues, la façon dont la valeur est traitée dépend de la façon dont le code la traite. Il n'y a rien pour vous dire qu'un bloc de mémoire est un entier signé ou non signé ou un double ou une chaîne ou autre chose. Les données brutes sont le type que vous choisissez d'interpréter.
Welbog
3
@Suraj, je suggère de consulter l'article Wikipedia sur le complément à deux pour la réponse complète: en.wikipedia.org/wiki/Two%27s_complement . La réponse courte est le MSB 1indique -8, et les trois autres 1s indiquent 4, 2et 1, respectivement, de sorte -8+4+2+1 = -1.
Welbog
18

Wikipedia dit tout:

Le système à complément à deux a l'avantage de ne pas exiger que les circuits d'addition et de soustraction examinent les signes des opérandes pour déterminer s'il faut ajouter ou soustraire. Cette propriété rend le système à la fois plus simple à mettre en œuvre et capable de gérer facilement une arithmétique de plus haute précision. De plus, le zéro n'a qu'une seule représentation, ce qui évite les subtilités associées au zéro négatif, qui existe dans les systèmes complémentaires à un.

En d'autres termes, l'ajout est le même, que le nombre soit négatif ou non.

Yacoby
la source
Monsieur, si j'écris char a = 12; et le caractère non signé b = 12, le bit sous-jacent est-il le même, que se passe-t-il vraiment?
Suraj Jain
Rien ne change lors de l'écriture ou de la lecture. Uniquement applicable en cas d'addition ou de soustraction.
Talespin_Kit
12

Même si cette question est ancienne, permettez-moi de mettre mes 2 cents.

Avant d'expliquer cela, revenons à l'essentiel. Le complément 2 'est le complément 1 + 1. Maintenant, quel est le complément de 1 et quelle est sa signification en plus.

La somme de n'importe quel nombre de n bits et son complément à 1 vous donne le nombre le plus élevé possible qui peut être représenté par ces n bits. Exemple:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

Maintenant, que se passera-t-il si nous essayons d'ajouter 1 de plus au résultat. Il en résultera un débordement.

Le résultat sera 1 0000qui est 0 (comme nous travaillons avec des nombres à 4 bits, (le 1 à gauche est un débordement)

Alors ,

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

Quelqu'un a alors décidé d'appeler le complément 1 + 1 comme complément 2 '. Ainsi, l'énoncé ci-dessus devient: Tout nombre n'bit + son complément à 2 = 0, ce qui signifie le complément à 2 d'un nombre = - (de ce nombre)

Tout cela nous amène à une autre question, pourquoi pouvons-nous utiliser uniquement le (n-1) des n bits pour représenter un nombre positif et pourquoi le nième bit le plus à gauche représente-t-il le signe (0 sur le bit le plus à gauche signifie + nombre ve, et 1 signifie -ve numéro). Par exemple, pourquoi utilisons-nous uniquement les 31 premiers bits d'un int en java pour représenter un nombre positif si le 32e bit est 1, son nombre ave.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (le résultat est zéro, avec le carry 1 débordant)

Ainsi le système de (n + 2 'complément de n) = 0, fonctionne toujours. La seule ambiguïté est ici le complément à 2 de 12 est 0100 qui représente également de manière ambiguë +8, autre que représentant -12 dans le système de complément à 2.

Ce problème sera résolu si les nombres positifs ont toujours un 0 dans leur bit le plus à gauche. Dans ce cas, leur complément à 2 aura toujours un 1 dans leur bit le plus à gauche, et nous n'aurons pas l'ambiguïté du même ensemble de bits représentant un numéro de complément à 2 ainsi qu'un nombre + ve.

Rpant
la source
1
+ 1'ed. Il s'agissait d'informations, mais à la fin, je ne sais pas pourquoi vous vouliez avoir l'approche la plus significative pour représenter s'il s'agit d'un nombre positif ou négatif. Il a de nombreux problèmes comme 0 aura 2 représentations - 0000 (+) et 1000 (-) .. De plus, l'addition et la soustraction ne peuvent pas être effectuées en utilisant le même algorithme. Quand vous dites un 0100 normal alors c'est +8 et quand vous dites le complément à deux 0100 alors c'est -12 ..
hagrawal
8

Le complément à deux permet de faire l'addition et la soustraction de la manière normale (comme si vous enrouliez pour des nombres non signés). Il empêche également -0 (une manière distincte de représenter 0 qui ne serait pas égale à 0 avec la méthode normale de comparaison bit par bit).

Zifre
la source
6

il s'agit de simplifier les sommes et les différences de nombres. une somme d'un nombre négatif et d'un positif codifié dans les compléments de 2 équivaut à les résumer normalement.

Stefano Verna
la source
5

L'implémentation habituelle de l'opération est de «retourner les bits et d'ajouter 1», mais il existe une autre façon de la définir qui rend probablement la justification plus claire. Le complément de 2 est la forme que vous obtenez si vous prenez la représentation non signée habituelle où chaque bit contrôle la puissance suivante de 2, et rend juste le terme le plus significatif négatif.

Prendre une valeur de 8 bits a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0

L'interprétation binaire non signée habituelle est:
2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

L'interprétation du complément à deux est:
-2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

Aucun des autres bits ne change la signification du tout, et le transfert dans un 7 est un "débordement" et ne devrait pas fonctionner, donc presque toutes les opérations arithmétiques fonctionnent sans modification (comme d'autres l'ont noté). La grandeur de signe inspecte généralement le bit de signe et utilise une logique différente.

puetzk
la source
4

Le complément à deux permet d'additionner des nombres négatifs et positifs sans aucune logique particulière.

Si vous avez essayé d'ajouter 1 et -1 en utilisant votre méthode
10000001 (-1)
+00000001 (1)
vous obtenez
10000010 (-2)

Au lieu de cela, en utilisant le complément à deux, nous pouvons ajouter

11111111 (-1)
+00000001 (1) vous obtenez
00000000 (0)

Il en va de même pour la soustraction.

De plus, si vous essayez de soustraire 4 de 6 (deux nombres positifs), vous pouvez compléter 2 à 4 et additionner les deux ensemble 6 + (-4) = 6 - 4 = 2

Cela signifie que la soustraction et l'ajout de nombres positifs et négatifs peuvent tous être effectués par le même circuit dans le processeur.

CodeFusionMobile
la source
4

Pour développer d'autres réponses:

En complément à deux

  • L'ajout est le même mécanisme que l'ajout d'entiers positifs simples.
  • La soustraction ne change pas trop
  • La multiplication aussi!

La division nécessite un mécanisme différent.

Tout cela est vrai parce que le complément à deux est juste une arithmétique modulaire normale, où nous choisissons de regarder certains nombres comme négatifs en soustrayant le modulo.

yairchu
la source
Non que seule la multiplication non élargie soit la même . Mais comme la plupart des langages de haut niveau ne prennent pas en charge l'élargissement de la multiplication sans transtypage explicite, le résultat sera le même dans ces langages.
phuclv
@ LưuVĩnhPhúc: L'élargissement de la multiplication sera généralement le même, mais les résultats des multiplications signées et non signées ne sont garantis que s'ils sont dans la plage d'un entier signé. Certains compilateurs comme gcc, étant donné quelque chose comme unsigned mul(unsigned short x, unsigned short y) { return x*y; }[16 bits court; 32 bits int] générera occasionnellement du code qui fonctionnera mal si le produit est plus grand que 2147483647.
supercat
2

En lisant les réponses à cette question, je suis tombé sur ce commentaire [édité].

Le complément 2 de 0100 (4) sera 1100. Maintenant 1100 est 12 si je dis normalement. Donc, quand je dis 1100 normal, c'est 12, mais quand je dis 1100 à 2, alors c'est -4? De plus, en Java lorsque 1100 (supposons 4 bits pour l'instant) est stocké, alors comment il est déterminé si c'est +12 ou -4 ?? - hagrawal 2 juil à 16:53

À mon avis, la question posée dans ce commentaire est assez intéressante et je voudrais donc tout d'abord la reformuler et ensuite fournir une réponse et un exemple.

QUESTION - Comment le système peut-il déterminer comment interpréter un ou plusieurs octets adjacents? En particulier, comment le système peut-il établir si une séquence d'octets donnée est un nombre binaire simple ou un complément à 2?

REPONSE - Le système établit comment interpréter une séquence d'octets à travers les types. Les types définissent

  • combien d'octets doivent être considérés
  • comment ces octets doivent être interprétés

EXEMPLE - Ci-dessous, nous supposons que

  • charmesurent 1 octet de long
  • shortmesurent 2 octets
  • int'et float' ont une longueur de 4 octets

Veuillez noter que ces tailles sont spécifiques à mon système. Bien qu'ils soient assez courants, ils peuvent être différents d'un système à l'autre. Si vous êtes curieux de savoir ce qu'ils sont sur votre système, utilisez l' opérateur sizeof .

Tout d'abord, nous définissons un tableau contenant 4 octets et les initialisons tous au nombre binaire 10111101, correspondant au nombre hexadécimal BD.

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

Ensuite, nous lisons le contenu du tableau en utilisant différents types.

unsigned char et signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short et short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, intetfloat

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

Les 4 octets de RAM ( l_Just4Bytes[ 0..3 ]) restent toujours les mêmes. La seule chose qui change, c'est la façon dont nous les interprétons.

Encore une fois, nous expliquons au système comment les interpréter à l'aide de types .

Par exemple, ci-dessus, nous avons utilisé les types suivants pour interpréter le contenu du l_Just4Bytestableau

  • unsigned char: 1 octet en binaire ordinaire
  • signed char: 1 octet en complément à 2
  • unsigned short: 2 octets en notation binaire simple
  • short: 2 octets en complément à 2
  • unsigned int: 4 octets en notation binaire simple
  • int: 4 octets en complément à 2
  • float: 4 octets en notation simple précision IEEE 754

[MODIFIER] Ce message a été modifié après le commentaire de user4581301. Merci d'avoir pris le temps de laisser tomber ces quelques lignes utiles!

mw215
la source
Ce blob de code a besoin d'une modification pour que les lecteurs n'aient pas à faire défiler d'avant en arrière. Mieux, ce commentaire massif en haut devrait devenir du vieux texte brut et laisser le moteur de rendu se charger du formatage. Vous devez également ajouter une mise en garde au bit près de la fin où vous discutez des tailles et du formatage car les tailles ne sont pas fixes.
user4581301
+1. Une chose que vous pourriez envisager de faire, @ mw215, est de faire de cette paire question / réponse une entrée de wiki communautaire à elle seule, car elle est utile pour les personnes qui pourraient être intéressées par l'interprétation d'octets bruts en dehors du contexte des mathématiques à deux compléments.
Welbog
Je veux juste savoir si le complément de 2 suit toujours, je veux dire si je l'ai int x = -4, et je fais alors printf("%d" , x)comment est-il interprété? Quelle est également la différence entre unsigned intet signed intet %det %u... cela me dérange depuis longtemps maintenant. Merci.
Suraj Jain
@Suraj Jain Lors de l'utilisation de inttypes, le signedmodificateur est par défaut. Cela signifie que intet signed intsont exactement du même type. D'où les deux définitions int i = -4;et signed int i = -4;ont la même signification.
mw215
@Suraj Jain Le système établit comment interpréter une séquence d'octets à travers les types. Les types définissent: combien d'octets doivent être pris en compte et comment ces octets doivent être interprétés. Un intest de 4 octets en complément de 2 et un unsigned intest de 4 octets en notation binaire simple (vérifiez la taille réelle du type sur votre système à l'aide de l' sizeofopérateur).
mw215
1

Vous pouvez regarder le professeur Jerry Cain de Stanford expliquer le complément à deux, dans la deuxième conférence (l'explication concernant le complément à 2 commence vers 13h00) dans la série de conférences intitulée Programming Paradigms disponibles à regarder sur la chaîne YouTube de Standford. Voici le lien vers la série de conférences: http://www.youtube.com/view_play_list?p=9D558D49CA734A02 .

alexs
la source
0

Le complément à deux est utilisé car il est plus simple à mettre en œuvre dans les circuits et ne permet pas non plus un zéro négatif.

S'il y a x bits, le complément à deux va de + (2 ^ x / 2 + 1) à - (2 ^ x / 2). Le complément de l'un s'exécutera de + (2 ^ x / 2) à - (2 ^ x / 2), mais permettra un zéro négatif (0000 est égal à 1000 dans un système de complément à 4 bits 1).

samoz
la source
0

Eh bien, votre intention n'est pas vraiment d'inverser tous les bits de votre nombre binaire. Il s'agit en fait de soustraire chacun son chiffre de 1. C'est juste une heureuse coïncidence que la soustraction de 1 de 1 donne 0 et de la soustraction de 0 de 1.

Mais pourquoi trouvez-vous la différence de chaque chiffre par rapport à 1? Eh bien non. Votre intention réelle est de calculer la différence du nombre binaire donné à partir d'un autre nombre binaire qui a le même nombre de chiffres mais ne contient que des 1. Par exemple, si votre numéro est 10110001, lorsque vous retournez tous ces bits, vous calculez efficacement (11111111 - 10110001).

Cela explique la première étape du calcul du complément à deux. Maintenant, incluons la deuxième étape - ajouter 1 - également dans l'image.

Ajoutez 1 à l'équation binaire ci-dessus:

11111111 - 10110001 + 1

Qu'est ce que tu obtiens? Ce:

100000000 - 10110001

Ceci est l'équation finale. Et en effectuant ces deux étapes, vous essayez de trouver cela, dernière différence: le nombre binaire soustrait d'un autre nombre binaire avec un chiffre supplémentaire et contenant des zéros, sauf à la position de bit la plus significative.

Mais pourquoi voulons-nous vraiment après cette différence? Eh bien, à partir d'ici, je pense que ce serait mieux si vous lisiez l'article Wikipedia .

Frédéric le fou
la source
0

Nous effectuons uniquement une opération d'addition pour l'addition et la soustraction. Nous ajoutons le deuxième opérande au premier opérande pour l'addition. Pour la soustraction, nous ajoutons le complément à 2 du deuxième opérande au premier opérande.

Avec une représentation du complément à 2, nous n'avons pas besoin de composants numériques séparés pour la soustraction - seuls des additionneurs et des complémenteurs sont utilisés.

subhakar
la source
0

Il convient de noter que sur certaines machines à ajouter tôt, avant l'époque des ordinateurs numériques, la soustraction serait effectuée en demandant à l'opérateur d'entrer des valeurs en utilisant un jeu de légendes de couleur différente sur chaque touche (de sorte que chaque touche entrerait neuf moins le nombre à être soustrait), et appuyer sur un bouton spécial supposerait un report dans un calcul. Ainsi, sur une machine à six chiffres, pour soustraire 1234 d'une valeur, l'opérateur frappait des touches qui indiquaient normalement "998 765" et appuyait sur un bouton pour ajouter cette valeur plus une au calcul en cours. L'arithmétique du complément à deux est simplement l'équivalent binaire de l'arithmétique antérieure du "complément à dix".

supercat
la source
0

L'avantage d'effectuer la soustraction par la méthode du complément est la réduction de la
complexité matérielle. Les différents circuits numériques ne sont pas nécessaires pour l'addition et la soustraction. L'addition et la soustraction sont effectuées par l'additionneur uniquement.

user2640494
la source
0

Un avantage majeur de la représentation en complément à deux qui n'a pas encore été mentionné ici est que les bits inférieurs d'une somme, d'une différence ou d'un produit à complément à deux ne dépendent que des bits correspondants des opérandes. La raison pour laquelle la valeur signée sur 8 bits pour -1 est 11111111que la soustraction de tout entier dont les 8 bits les plus bas sont 00000001de tout autre entier dont les 8 bits les plus bas 0000000donnera un entier dont les 8 bits les plus bas sont11111111. Mathématiquement, la valeur -1 serait une chaîne infinie de 1, mais toutes les valeurs dans la plage d'un type entier particulier seront soit toutes les 1 soit toutes les 0 après un certain point, il est donc pratique pour les ordinateurs de "prolonger par signe" le bit le plus significatif d'un nombre comme s'il représentait un nombre infini de 1 ou de 0.

Le complément à deux est à peu près la seule représentation de nombre signé qui fonctionne bien lorsque l'on traite des types plus grands que la taille naturelle d'un mot d'une machine binaire, car lors de l'addition ou de la soustraction, le code peut extraire le bloc le plus bas de chaque opérande, calculer le bloc le plus bas de le résultat et le stocker, puis charger le morceau suivant de chaque opérande, calculer le morceau suivant du résultat et le stocker, etc. Ainsi, même un processeur qui nécessite tous les ajouts et soustractions pour passer par un seul registre 8 bits peut gérer les numéros signés 32 bits de manière raisonnablement efficace (plus lent qu'avec un registre 32 bits, bien sûr, mais toujours utilisable).

Lors de l'utilisation de toute autre représentation signée autorisée par la norme C, chaque bit du résultat pourrait potentiellement être affecté par n'importe quel bit des opérandes, ce qui oblige à conserver une valeur entière dans les registres à la fois ou à suivre les calculs avec un supplément étape qui, dans certains cas au moins, nécessiterait la lecture, la modification et la réécriture de chaque bloc du résultat.

supercat
la source
Veuillez formater votre réponse dans le paragraphe et marquer le code comme code, il serait plus lisible et vous obtiendrez un vote positif.
Suraj Jain
@SurajJain: Est-ce mieux?
supercat
Ouais, mieux que ce qu'il était auparavant, je veux vous demander une chose quelle est la différence entre le caractère signé a = 1 et le caractère non signé a = 1, comment sont-ils représentés en mémoire.
Suraj Jain
@SurajJain: Sur les systèmes à complément à deux où "char" est plus petit que "int" [c'est-à-dire la grande majorité des systèmes], les types char signés et non signés se comporteront de façon identique, sauf que les types signés seront étendus en cas de lecture et les types non signés habitude. Sur un tel système, le stockage de la valeur 194 ou -62 dans un caractère signé écrira le même motif binaire que le stockage de 194 ou -62 dans un caractère non signé (c'est-à-dire 11000010). La lecture de ce motif de bits à partir d'un caractère signé produira -62, et sa lecture à partir d'un caractère non signé produira 194.
supercat
signe étendu signifie?
Suraj Jain
0

Il existe différents types de représentations:

  1. représentation des numéros non signés
  2. représentation du numéro signé
  3. sa représentation complémentaire
  4. Représentation du complément à deux

-Représentation du nombre non signé utilisé pour représenter uniquement les nombres positifs

-La représentation numérique signée sert à représenter un nombre positif aussi bien qu'un nombre négatif. Dans la représentation du nombre signé, le bit MSB représente le bit de signe et les bits de repos représentent le nombre. Lorsque MSB est 0, le nombre est positif et lorsque MSB est 1, le nombre est négatif.

Le problème avec la représentation des nombres signés est qu'il y a deux valeurs pour 0.

Le problème avec la représentation du complément est qu'il y a deux valeurs pour 0.

Mais si nous utilisons la représentation du complément à deux, il n'y aura qu'une seule valeur pour 0, c'est pourquoi nous représentons des nombres négatifs sous forme de complément à deux.

Source: pourquoi les nombres négatifs sont stockés sous forme de complément de deux octets de gigaoctets

sagar khamkar
la source
-1

Une réponse satisfaisante de la raison pour laquelle le complément de Two2 est utilisé pour représenter des nombres négatifs plutôt que le système de complément de One est que le système de complément de Two résout le problème des représentations multiples de 0 et le besoin de report qui existe dans le système de complément de One pour représenter le négatif Nombres.

Pour plus d'informations, visitez https://en.wikipedia.org/wiki/Signed_number_representations

Pour la fin du tour, visitez https://en.wikipedia.org/wiki/End-around_carry

Harshit Bhatia
la source
en fait, si vous avez une virgule décimale et expliquez ce que sont tous les bits: "0..0000.1111..1" signifie que tous les bits non déclarés les plus à gauche sont 0, et tous les bits non déclarés les plus à droite sont 1, et donc le "..1" signifie qu'un report est déclenché. C'est donc (mécaniquement) "0.0001.0000..0". Cela signifie que "1..1111.1111..1" est égal à zéro! Cela signifie également que pour annuler un entier, il suffit de retourner ses bits. Mais cela s'applique désormais aux fractions représentables.
Rob