Langage à la c.. …

De l’intérêt des attributs unsigned

Dans la série « toi aussi passe pour une andouille », deux choses me semblent importantes à rappeler sur le C (parce que je viens de me faire avoir sur les deux à une semaine d’intervalle) :

  • Le décalage à droite de bidules signés crée, selon les implémentations du compilo (ce n’est PAS défini dans le standard), des zéros (décalage logique) OU des bits de signe (décalage arithmétique) à la place des bits décalés ;
  • Le langage ne définit PAS le comportement des dépassements sur entiers non signés. En l’occurrence, sur une différence, je suis tombée sur un cas où le code généré par GCC 4.2 était à première vue pas correct ; en fait c’est mon code qui ne l’était pas puisqu’ayant un comportement non défini. Les boules.

Pour ceux qui se poseraient la question, les deux comportement sont définis sur les entiers non signés (ajout de zéros pour le premier cas, par un modulo classique pour le deuxième).

(Et je les traite comment, moi, mes benchs ? On va tenter de voir ce que ça donne en unsigned… et prier un grand coup.)

2 commentaires sur « Langage à la c.. … »

  1. Et ausi, se souvenir que selon les plateforms, un ‘char’ est unsigned oupa. Jouissance garantie quand on emploie un char signé pour indicer un tableau…

  2. Et bé!
    on a beau lire de vieux poste, on constate plein de choses. 1- tu n’a visiblement pas fait d’étude d’électronique si cela t’a posé des problèmes. (c’est pas méchant) 2- pour les décalages de bits il y a aussi un fonctionnement comme la commande ROL du VHDL.
    Ce qui veut dire que ton problème avec un décalage de signe pour les signés peut exister aussi pour les non signés!
    Le compilateur intel le permet sur simple option à la compilation (de plus c’est plus simple à faire pour un processeur). En fait le décalage type ROL est le décalage de bit présent dans tout les processeurs. Si tu demande un décalage à gauche avec ajout d’un 0 tu applique:
    = ROL & !0x1; voila donc dans le cas d’un ROR (décalage à droite):
    (var) >> 1 est équivalent à (pour le compilateur)
    ((var) & !0x1) ROR. sans le filtre par 0x1 ton bit de poid faible devenant celui de poid fort, attention s’il est à 1! et le bonheur arrive quand tu code en assembleur ou la il faut que tu tienne compte de l’agencement des bits quand tu fait ton masque! (et la tu maudit l’architecture little-endian, vive le PPC!). voilou ce que j’avais à dire sur le sujet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s