2011-04-25 4 views
4

Bien que les deux extraits ci-dessous présentent une légère différence dans la manipulation de la variable de recherche, la sortie semble toujours la même. Pourquoi ça?Discordance dans Snippet

premier extrait

#include<iostream> 
    using namespace std; 
    int main() 
    { 

    int number = 3,find; 
    find = number << 31; 
    find *= -1; 
    cout << find; 
    return 0; 
    } 

deuxième Snippet
#include<iostream> 
    using namespace std; 
    int main() 
    { 
    int number = 3,find; 
    find = number << 31; 
    find *= 1; 
    cout << find; 
    return 0; 
    } 

sortie pour les deux extraits:

-2147483648 

(selon Ideone: 1, 2)

+0

Quelle est la taille de int sur votre machine? 32 bits? Ma bonne supposition serait que si vous changez 30 bits, vous devriez obtenir des résultats différents. – matcheek

+1

Voir cette [question] (http://stackoverflow.com/questions/3784996/why-does-left-shift-operation-invoke-undefined-behaviour-when-the-left-side-opera). Vous invoquez un comportement indéfini. – Mat

+0

@ matcheek: Oui c'est 32, mais je n'arrive pas à comprendre comment l'objectif de la question serait atteint s'il est changé à 30. – NirmalGeo

Répondre

4

Dans les deux vos échantillons, en supposant 32bit int s, vous êtes invoquer un comportement non défini comme indiqué dans Why does left shift operation invoke Undefined Behaviour when the left side operand has negative value?

Pourquoi? Parce que number est un int signé, avec 32 bits de stockage. (3<<31) n'est pas représentable dans ce type.

Une fois que vous êtes dans un territoire de comportement indéfini, le compilateur peut faire ce qu'il veut.

(Vous ne pouvez pas compter sur l'un des éléments suivants parce que c'est UB - c'est juste une observation de ce que votre compilateur semble faire).

Dans ce cas, il semble que le compilateur effectue le décalage correct, ce qui donne 0x80000000 sous la forme d'une représentation binaire. Cela se trouve être la représentation du complément à deux de INT_MIN. Donc, le deuxième extrait n'est pas surprenant.

Pourquoi le premier produit-il la même chose? Dans le complément à deux, MIN_INT serait -2^31. Mais la valeur maximale est 2^31-1. MIN_INT * -1 serait 2^31 (si c'était représentable). Et devinez quelle représentation cela aurait? 0x80000000. Retour à l'endroit où vous avez commencé!