14 votes

Les opérateurs bit à bit peuvent-ils avoir un comportement indéfini ?

Opérateurs binaires ( ~ , & , | y ^ ) opèrent sur la représentation binaire de leurs opérandes promus. De telles opérations peuvent-elles provoquer un comportement indéfini ?

Par exemple, le ~ est défini de cette manière dans la norme C :

6.5.3.3 Opérateurs arithmétiques unaires

Le résultat de la ~ est le complément bit à bit de son opérande (promu) (c'est-à-dire que chaque bit du résultat est activé si et seulement si le bit correspondant de l'opérande converti n'est pas activé). Les promotions d'entiers sont effectuées sur l'opérande, et le résultat a le type promu. Si le type promu est un type non signé, l'expression ~E est équivalent à la valeur maximale représentable dans ce type moins E .

Sur toutes les architectures, ~0 produit un motif de bits avec le bit de signe réglé sur 1 et tous les bits de valeur sont mis à 1 . Sur une architecture à complément à un, cette représentation correspond à un zéro négatif. Ce motif binaire peut-il être une représentation piège ?

Existe-t-il d'autres exemples de comportement non défini impliquant de simples opérateurs bit à bit pour des architectures plus courantes ?

10voto

Antti Haapala Points 11542

Pour les systèmes de complément, il est explicitement prévu la possibilité de valeurs pièges pour ceux qui ne supportent pas les systèmes de complément. zéros négatifs en nombres entiers signés ( C11 6.2.6.2p4 ):

Si l'implémentation ne prend pas en charge les zéros négatifs, le comportement des opérateurs &, |, ^, ~, << et >> avec des opérandes qui produiraient une telle valeur est indéfini.

Mais encore une fois, les systèmes de complément ne sont pas exactement communs ; comme par exemple GCC n'en supporte aucun !

C11 implique effectivement que le les aspects définis et non définis de la mise en œuvre sont juste autorisés pour signé types (C11 6.5p4).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X