Et mon bit de signe ?

Et mon bit de signe ? - C++ - Programmation

Marsh Posté le 02-11-2002 à 22:44:09    

Hello
 
 
Lors d'un décalage de bits vers la gauche (sur une variable int par exemple), le bit de signe est-il conservé ?
 
J'espère que oui, mais ça me semble quand même illogique, il devrait se retrouver à la benne, non ?
 
Merci de votre aide.

Reply

Marsh Posté le 02-11-2002 à 22:44:09   

Reply

Marsh Posté le 03-11-2002 à 01:28:26    

Oui, poubelle...

Reply

Marsh Posté le 03-11-2002 à 19:14:12    

Hmm, je viens de faire un test :
 
    int x = -1;
    x<<=14;
    printf("x = %d\n", x);
    int y = 1;
    y<<=14;
    printf("y = %d\n", y);
    getchar();
 
 
Et... le bit de signe est conservé du début à la fin : x est négatif et y positif !
 
...je ne comprends pas
 
 
Si quelqu'un peut m'expliquer, il est le bienvenu !

Reply

Marsh Posté le 03-11-2002 à 20:05:44    

ls décalages sur les types signés ne sont pas définis, cela revient à l'implémentation. a toi de tester


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 04-11-2002 à 01:09:12    

un décallage à gauche conserve le signe.
en ASM x86, les instructions SAL (décalage arithmétique gauche) et SHL (décalage gauche) sont les mêmes, seules les décalages à droite implique réellement une version prenant en compte le signe et une non. (SAR et SHR).
 
 

Reply

Marsh Posté le 04-11-2002 à 01:14:17    

pour un char:        dec à gauche de 1
 
1  => 0000 0001        << 0000 0010 : 2
3  => 0000 0011 (1+2)  << 0000 0110 : 6 (4+2)
-1 => 1111 1111        << 1111 1110 : -2  
-3 => 1111 1101        << 1111 1010 : -6
 
décaller à gauche ne fait pas perdre le signe...

Reply

Marsh Posté le 04-11-2002 à 23:59:48    

Même l'incidence d'un décalage sur la valeur arithmétique n'est pas défini, puisque la représentation binaire interne n'est pas imposée.
 
Comment ça se passe sur intel...
Type signé décalé à droite: Le bit de signe est dupliqué/propagé.
Les autres cas: Tous les bits sont décalés, des 0 sont introduits.
 
A cause de cette particularité, j'ai voulu créer un "sign_cast<signed>(n)", mais j'y arrive pas.
 

leneuf22 a écrit a écrit :

Et... le bit de signe est conservé du début à la fin : x est négatif et y positif !
...je ne comprends pas


Tes int font probablement 32 bits. Tu as donc écrasé un 1 avec un 1, et un 0 avec un 0.
Essaie ça:

Code :
  1. #include <limits.h>
  2. signed int si=1;
  3. si<<=sizeof(signed int)*CHAR_BIT-2;
  4. si<<=1;


 

bjone a écrit a écrit :

un décallage à gauche conserve le signe.


Ben justement non...


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 05-11-2002 à 01:58:53    

Un décalage a gauche, c'est une multiplication par deux. Tant que x*2 rentre dans un entier, le décalage a gauche conserve le signe. Si x*2 ne rentre pas dans un entier, bah ca rentre pas quoi :D

Reply

Marsh Posté le 05-11-2002 à 02:05:03    

Ca sert à quoi les signed ? [un programmeur chez MS] :D
 
 
 
 
 
 
 
 
 
OK ... Je sors ...


---------------
last.fm
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed