Peu importe si le type sous-jacent est signé de unsigned, à condition que vous n'utilisiez que des valeurs positives pour votre énumération, car une valeur positive devrait avoir la même représentation qu'un type signé ou non signé. Standard dit en 6.2.6.2 Représentation des types/types entiers §5: Une représentation d'objet valide (non-piège) d'un type entier signé où le bit de signe est zéro est une représentation d'objet valide du type non signé correspondant , et doit représenter la même valeur.
Ainsi, vous pouvez sans risque faire la distribution non signée si vous le souhaitez. Quoi qu'il en soit, si le type sous-jacent est char (ou a été unsigned char), il peut être promu (en silence) en int avant tout calcul.
à mon humble avis, MISRA-C: 2004 indique que les opérations bitwize ne doivent pas se faire avec un type signé, parce que la norme indique explicitement que la représentation d'un nombre négatif est défini par l'implémentation:
Pour les types entiers signés, les bits de la représentation de l'objet doivent être divisés en trois groupes : les bits de valeur, les bits de remplissage et le bit de signe. Il n'y a pas besoin de bits de remplissage; il doit y avoir exactement un bit de signe ... Si le bit de signe est une, la valeur doit être modifiée dans l'une des façons suivantes:
TL/DR: Si vous avez pas d'avertissement (et vous ne devriez pas pour Bitwise ou |
) vous peut en toute sécurité utiliser aucun casting du tout. Si vous affectez au type non signé une valeur positive, la représentation reste inchangée et vous pouvez également effectuer le cast si vous (ou vos règles d'entreprise) décidez de suivre MISRA-C, ainsi vous pouvez également lancer en toute sécurité vers un type non signé
Bien sûr, je peux le lancer, je suis à la recherche d'une approche globale. – lkanab
Qu'entendez-vous par «approche globale»? Comme la plupart des règles MISRA, ils vous disent d'éviter un code parfaitement bon. C'est parfaitement bon code. Vous devrez empirer le code avec un casting redondant afin de se conformer. –
Une option privilégiée serait 'volatile unsigned char * reg = (volatile unsigned char *) SomeAddress; ' –