Essayer de répondre à la fois à la question explicite (qu'est-ce que CHAR_BIT) et à la question implicite (comment cela fonctionne-t-il) dans la question d'origine.
Un caractère en C et C ++ représente la plus petite unité de mémoire que le programme C peut adresser *
CHAR_BIT en C et C ++ représente le nombre de bits dans un char. Il doit toujours être au moins égal à 8 en raison d'autres exigences du type char. En pratique, sur tous les ordinateurs à usage général modernes, il est exactement de 8, mais certains systèmes historiques ou spécialisés peuvent avoir des valeurs plus élevées.
Java n'a pas d'équivalent de CHAR_BIT ou de sizeof, il n'est pas nécessaire car tous les types primitifs en Java sont de taille fixe et la structure interne des objets est opaque pour le programmeur. Si vous traduisez ce code en Java, vous pouvez simplement remplacer "sizeof (int) * CHAR_BIT - 1" par la valeur fixe 31.
Dans ce code particulier, il est utilisé pour calculer le nombre de bits dans un int. Sachez que ce calcul suppose que le type int ne contient aucun bit de remplissage.
En supposant que votre compilateur choisisse de signer une extension sur les décalages de bits des nombres signés et en supposant que votre système utilise une représentation complémentaire de 2s pour les nombres négatifs, cela signifie que "MASK" sera 0 pour une valeur positive ou zéro et -1 pour une valeur négative.
Pour annuler un nombre de complément à deux, nous devons effectuer un non au niveau du bit, puis en ajouter un. De manière équivoque, nous pouvons en soustraire un, puis le nier au niveau du bit.
Encore une fois, en supposant que la représentation du complément à deux - -1 est représentée par tous les uns, donc exclusif ou avec -1 équivaut à une négation au niveau du bit.
Ainsi, lorsque v vaut zéro, le nombre est laissé seul, lorsque v est égal à un, il est annulé.
Il faut savoir que le débordement signé en C et C ++ est un comportement indéfini. Donc, utiliser cette implémentation ABS sur la valeur la plus négative conduit à un comportement indéfini. Cela peut être résolu en ajoutant des transtypages de sorte que la dernière ligne du programme soit évaluée dans unsigned int.
* Ce qui est généralement mais pas nécessairement la même que la plus petite unité de mémoire que le matériel peut adresser. Une mise en œuvre peut potentiellement combiner plusieurs unités de mémoire adressable par matériel en une unité de mémoire adressable par programme ou diviser une unité de mémoire adressable par matériel en plusieurs unités de mémoire adressable par programme.