Les résultats des opérations bit à bit sur les entiers signés défini?
Je sais que le comportement de >>
sur entier signé peut être dépendant de l'implémentation (en particulier, lorsque l'opérande de gauche est négatif).
Que sur les autres: ~
, >>
, &
, ^
, |
?
Lors de leurs opérandes sont des entiers signés de type intégré (short
, int
, long
, long long
), les résultats sont garantis d'être le même (en termes de bits de contenu) comme si leur type est non signé?
- Il n'y a rien de confus au sujet de ~, & , ^,|, car ils fonctionnent sur le bit de niveau. Signé/non signé n'a pas d'importance.
>>
est généralement mise en œuvre de l'arithmétique décalage à droite (correctement / 2 nombre) que si elle est signée, et la logique décalage à droite (remplir avec de zéro) si non signé.<<
aussi n'ont pas de confusion, car nous allons seulement de supprimer les bits sur la gauche (et le remplir avec zéro sur la droite). - en.wikipedia.org/wiki/Signed_number_representations
- Vouliez-vous dire
<<
plutôt que>>
dans votre liste des "autres" opérateurs?
Vous devez vous connecter pour publier un commentaire.
Pour les opérandes,
<<
a un comportement indéfini et le résultat de>>
la mise en œuvre est définie (généralement "arithmétique" maj droite).<<
et>>
sont théoriquement pas les opérateurs sur les bits. Ils sont des opérateurs arithmétiques équivalent à une multiplication ou une division par une puissance de deux pour les opérandes sur lesquels ils sont bien définies.Comme pour les véritables opérateurs au niveau du bit
^
,~
,|
, et&
, ils fonctionnent sur la représentation binaire de la valeur dans l' (éventuellement promu) type de l'opérande. Leurs résultats sont bien définis pour chaque choix possible de signé représentation (complément à deux, celles de compléter, ou le signe-amplitude) mais dans les deux derniers cas, il est possible que le résultat sera un piège de la représentation si la mise en œuvre traite de la "négatif zéro" de la représentation comme un piège. Personnellement, j'ai presque toujours utiliser unsigned expressions avec les opérateurs sur les bits de sorte que le résultat est 100% bien définis en termes de valeurs plutôt que représentations.Enfin, notez que cette réponse écrite ne peut s'appliquer à C. C et le C++ sont des langues très différentes, et bien que je ne sais pas C++ bien, je comprends que cela peut être différent dans certains de ces domaines à partir de C...
~INT_MAX
est autorisé à être un piège de la représentation, trop.~~INT_MAX == INT_MIN
sur un signe de magnitude de mise en œuvre qui prend en charge négatif zéro.INT_MIN==-INT_MAX
. 🙁<<
d'une valeur négative a un comportement indéterminé;>>
d'une valeur négative donne une mise en œuvre définies par résultat;&
,|
et^
opérateurs est définie en termes de la bit-à-bit de la représentation des valeurs. Trois possibilités sont autorisés pour la représentation des nombres négatifs dans C: en complément à deux, un " complément de signe et grandeur. La méthode utilisée par la mise en œuvre permettra de déterminer le résultat numérique lorsque ces opérateurs sont utilisés sur des valeurs négatives.Noter que la valeur du bit de signe 1 et tous les bits à zéro (pour le complément à deux de signe et grandeur), ou avec le bit de signe et tous les bits 1 (pour un " complément) est explicitement autorisé à être un piège de la représentation, et dans ce cas, si vous utilisez des arguments à ces opérateurs, qui permettrait de générer une telle valeur, le comportement est indéfini.
...the value with sign bit 1 and all value bits zero (for two's complement...) is explicitly allowed to be a trap representation
, il semble que si vous disent que c'est potentiellement une valeur non valide. Mais en complément à deux, je crois qu'il représenterait le plus négatif de la valeur de cette taille, bien défini.Le peu de contenu sera le même, mais les valeurs obtenues seront toujours dépendant de l'implémentation.
Vous ne devriez vraiment pas voir les valeurs signé ou non signé lors de l'utilisation des opérations bit à bit, parce que c'est de travailler sur un niveau différent.
À l'aide de types non signés vous permet d'économiser de certains de ces problèmes.
La Norme C89 défini le comportement de la gauche-déplacement des nombres signés basé sur des positions de bits. Si ni signé ni non signé types de rembourrage bits, le comportement requis pour les types non signés, combiné avec l'exigence que positif signé types de partager la même représentation que les types non signés, impliquerait que le bit de signe est immédiatement à gauche de la plus grande valeur de bit.
Ce, en C89, -1<<1 serait -2 sur le complément à deux implémentations qui n'ont pas de rembourrage bits et -3 sur ceux-compléter les implémentations qui n'ont pas de rembourrage bits. Si il y a un signe-amplitude des implémentations sans rembourrage bits, -1<<1 serait égale à 2 sur ceux-ci.
Le Standard C99 changé de gauche changements de valeurs négatives d'un Comportement Indéfini, mais rien dans le raisonnement donne aucune idée de pourquoi (ou même mentionne le changement à tous). Le comportement requis par C89 peut-être été moins qu'idéales dans certains de ceux-complément de mise en œuvre, de sorte qu'il aurait fait sens pour permettre à ceux qui les implémentations de la liberté de choisir quelque chose de mieux. Je n'ai pas vu de preuves pour suggérer que les auteurs de la Norme n'a pas prévu que la qualité en complément à deux implémentations devraient continuer à fournir le même comportement mandaté par C89, mais malheureusement ils n'avaient pas vraiment le dire.