Je lis du texte en C. Dans la session Valeurs négatives et positives, l'auteur a mentionné plusieurs façons de représenter un nombre négatif sous forme binaire.
J'ai tout compris et je me demandais si avec un nombre binaire donné, pouvons-nous déterminer s'il est négatif?
Par exemple, le -92 a la forme binaire 8 bits: 10100100
. Mais si on nous donne 10100100
, pouvons-nous dire que c'est -92, et pas un autre nombre non négatif?
Cela dépend de la représentation, bien sûr. Dans le complément à deux, qui est largement utilisé, il suffit de regarder l'élément le plus significatif.
Par exemple, le (nombre) -92 a la forme binaire: 10100100 (représentation sous forme d'octet à 8 bits). Mais si 10100100 est donné, pouvons-nous dire qu'il s'agit de -92, et non d'un autre nombre non négatif?
Non, vous aurez besoin de savoir à l'avance si un stockage signé ou non signé a été utilisé pour stocker le numéro, et vous aurez également besoin de connaître le encodage utilisé pour stocker le numéro.
Si l'entier de 8 bits (c'est-à-dire l'octet) est signé, conformément à Tom et à 32bitkid, les entiers signés sont généralement stockés dans le complément de 2 , où le bit le plus significatif (MSB) déterminera si un nombre est négatif ou non.
par exemple. Dans votre exemple, l'octet 10100100
pourrait soit représenter l'octet signé -92
, puisque:
MSB : 1 means negative
Other 7 Bits 0100100
Flip and add 1 => 1011011 + 1 = 1011100
From powers of two, right to left :
0*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 1*2^4 + 0*2^5 + 1*2^6
= 4 + 8 + 16 + 64
= 92 (and thus -92 because of the MSB)
OU si la valeur est un octet non signé, le MSB est simplement traité comme la puissance suivante de 2, identique à tous les bits inférieurs, c'est-à-dire que 10100100
pourrait représenter:
(Encore une fois, puissance de deux, de droite à gauche et en omettant le pouvoir 0
de deux))
4 + 32 + 128
= 164
La décision de déterminer si un entier doit être signé ou non est généralement déterminée par la plage de valeurs que vous devez y stocker. Par exemple, un entier signé 32 bits peut représenter la plage:
–2147483648 to 2147483647
Alors qu'un entier non signé de 32 bits peut représenter des nombres de
0 to 4294967295
Vous voulez lire sur complément à deux nombres. En bref, le bit le plus significatif peut être utilisé pour déterminer si le nombre est négatif.
Je relis votre question et vous dites que vous comprenez déjà le complément de deux. Lorsqu'il s'agit de nombres négatifs, le nombre de bits doit être connu pour déterminer si le nombre est négatif ou non. Un nombre négatif doit être signé étendu au nombre de bits requis. Votre exemple de -92 stocké en 32 bits serait 1111111111111111111111111110100100.
Si vous avez la valeur en mémoire, transformez-la en une signature de la même taille et vérifiez si elle est inférieure à zéro. Donc, if ((int)value < 0)
.
Si vous essayez d’analyser une constante binaire d’une chaîne, vous devez connaître le format du nombre. Cependant, le complément de deux est universel depuis cinquante ans maintenant. (La seule exception concerne la prise en charge compatible binaire de certains anciens ordinateurs centraux Unisys encore utilisés.) Pour cela, il vous suffit de regarder le premier bit (comme le dit la réponse acceptée).
Vous devez obligatoirement connaître le type (signé/non signé) du numéro pour déterminer le nombre négatif/positif. Si le type n'est pas mentionné, il est signé par défaut. S'il est signé, vous pouvez regarder le bit MSB pour déterminer le non positif ou négatif. S'il est mentionné comme non signé, vous devez compter le bit MSB pour obtenir le numéro décimal.