C- pourquoi le caractère c = 129 sera converti en -127?

si nous +128 à la variable char, elle est convertie en -128 raison de son équivalent binary (le 10000000-first bit tells sign ). L’équivalent binary de 129 est 10000001 , quelle sera la valeur à laquelle il sera converti?

Char c = 129;

Merci, s

Il y a en réalité plusieurs possibilités.

Si char est un type signé, alors

 char c = 129; 

convertit implicitement la valeur int en char . Le résultat est défini par l’implémentation (ou il peut générer un signal défini par l’implémentation, mais je ne connais aucune implémentation qui le fasse). Dans la plupart des implémentations, les rendements de conversion sont de 127 car les types signés sont représentés par un complément à deux. Dans un type non signé à 8 bits, 10000001 représente la valeur 129 ; dans un type signé à 8 bits, le même motif binary représente -127 ; la conversion n’est pas obligée de conserver le même motif binary, mais très couramment.

Si plain char est un type non signé (comme sur certains systèmes), la valeur 129 situe dans la plage de char et la conversion donne simplement la valeur 129 .

Mais tout cela suppose que le caractère est de 8 bits. La norme C exige que CHAR_BIT (le nombre de bits dans un octet, ou de manière équivalente dans un object char ) soit au moins égal à 8, mais cela lui permet d’être plus grand. Il est peu probable que vous renconsortingez un système avec CHAR_BIT > 8 , mais cela n’est pas rare dans les implémentations C pour les DSP .

Dépendre de tout cela est rarement une bonne idée. Quoi que vous essayiez d’accomplir en assignant 129 à un object char , il y a très probablement une manière plus efficace, plus claire et plus portable de le faire.

Les nombres négatifs sont stockés en tant que complément à 2 du positif de ce nombre.

Par exemple:

  -127 is stored as 2's compliment of 127 127 is 01111111 in binary 2's compliment=(1's compliment of a number) + 1 therefore, 2's compliment of 127(01111111) is 10000001(-127). And 10000001 is 129:: Therefore when you give 129 to a char variable, comstackr takes it as negative number 127. 

De même, 130 sera assigné comme -126.

Merci!!

Lorsque les nombres sont dans le domaine négatif (le bit de signature est égal à 1 ), ils prennent une valeur minimale lorsque la représentation binary “réelle” (c’est-à-dire en ignorant le bit de signature, traitant uniquement de la partie qui stocke le nombre) est égale à 0.

Par exemple

Le binary signé: 10000000 représente -128 en décimal.

Cela est logique car chaque incrément de la représentation binary comporte également un incrément du nombre décimal (rappelez-vous -127 est un de plus et que -128). Si vous traitez uniquement en décimal et ignorez les règles qui interdisent le débordement, vous verrez que lorsque le nombre approche la valeur positive maximale, il assume immédiatement la valeur négative maximale et compte jusqu’à 0.

Un autre point que vous pouvez voir est que la représentation binary pour -1 serait 11111111 . Si nous incrémentons cela d’un point, nous obtenons 1 00000000 où le premier est jeté, ce qui nous donne le nombre 0.

Un moyen rapide de déterminer la valeur d’un nombre négatif signé consiste à utiliser la représentation binary (en ignorant le bit de signature) et à l’append au nombre maximal négatif.

Par exemple

Si nous avons la représentation binary de 10000001 où la valeur non signée est 129, nous pouvons voir qu’en ignorant le bit de signature, nous avons 1 que nous ajoutons à -128 donnant la réponse de -127.

Veuillez noter que j’ignore le fait que parfois les débordements ne sont pas autorisés et qu’un comportement non défini peut en résulter. Je traite également des caractères signés dans cette réponse. Si vous avez affaire à des caractères non signés, l’expression binary complète est utilisée pour lui donner sa valeur (par exemple, 10000001 = 129).

Tenter de stocker +129 dans un caractère entraîne le stockage de -127. Lorsque nous essayons de stocker +128 dans un caractère, le premier chiffre du côté négatif, c’est-à-dire que -128 est stocké. En effet, à partir du binary 9 bits de +128, 010000000, seuls les 8 bits les plus à droite sont stockés. Mais lorsque 10000000 est stocké, le bit le plus à gauche est égal à 1 et il est traité comme un bit de signe. Ainsi, la valeur du nombre devient -128 puisqu’il s’agit bien du binary (complément à 2) de -128.En général, si nous dépassons la plage du côté positif, nous nous retrouvons du côté négatif. Vice versa est également vrai. Si nous dépassons la plage du côté négatif, nous finissons sur le côté positif.