OVH Cloud OVH Cloud

Transformation Int en Long et operateurs >>

5 réponses
Avatar
FB
Bonjour,

J'ai remarque que les operateurs >> ou << ne se comportent pas comme en
C ou en PHP, je pense a cause du fait que les Integer se transforment
automatiquement en Long.

Ce la me pose pas mal de problemes et je ne me sens pas de m'attaquer
aux classes avec surcharge des op=E9rateurs (avec des exceptions
associ=E9es pour g=E9rer les overflows).

Bref, si quelqu'un connait une solution simple pour que mes a << b
aient la meme valeur en python qu'en C ca serait super..

5 réponses

Avatar
F. Petitjean
Bonjour,

Bref, si quelqu'un connait une solution simple pour que mes a << b
aient la meme valeur en python qu'en C ca serait super..

J'émets des doutes sur l'utilité de réobtenir le comportement du C :


int x = 16; // 0x10
int y = x << 40; // 0 sur une machine 32 bits (où sont les
avertissements ?)

x = 16
x << 40
__main__:1: FutureWarning: x<<y losing bits or changing sign will return



a long in Python 2.4 and up
0
x + 0L << 40
17592186044416L




long(x) << 44
281474976710656L




Franchement, il n'y a pas photo.

Cordialement.



Avatar
FB
Certes, mais avec Python 2.4.2 on a meme pas le droit a un
avertissement et au lieu d'avoir par exemple :

5597564875 >> 13 = 159008

on obtient :

5597564875 >> 13 = 683296L

Il n'y a pas photo c'est vrai, mais comme j'utilise cet operateur dans
un calcul de checksum c'est assez embetant car ce genre de calcul
tolere mal les approximations :)
Avatar
Christophe
Certes, mais avec Python 2.4.2 on a meme pas le droit a un
avertissement et au lieu d'avoir par exemple :

5597564875 >> 13 = 159008

on obtient :

5597564875 >> 13 = 683296L

Il n'y a pas photo c'est vrai, mais comme j'utilise cet operateur dans
un calcul de checksum c'est assez embetant car ce genre de calcul
tolere mal les approximations :)



Je ne vois pas ton problème. La réponse de Python est juste ici alors
que je ne comprend pas comment comment obtenir la première réponse. Il
n'y a aucune logique ici.

Ah si j'ai trouvé : ceci te donne le bon résultat :

( 5597564875 & 0xFFFFFFFF ) >> 13

Avatar
F. Petitjean
Certes, mais avec Python 2.4.2 on a meme pas le droit a un
avertissement et au lieu d'avoir par exemple :

5597564875 >> 13 = 159008

on obtient :

5597564875 >> 13 = 683296L


Alors là chapeau : sur le système qui a python
Python 2.3.4 (#1, Jun 9 2004, 17:31:37)
5597564875 >> 13
683296L



5597564875L >> 13
683296L




et avec ActivePython 2.4.1 Build 245 (ActiveState Corp.) based on...
5597564875 >> 13
683296L



5597564875L >> 13
683296L




Donc effectivement le FutureWarning (de 2.3.4) ne s'affiche pas mais le
résultat final est chaque fois le même. Si vous avez effectivement un
résultat différent avec 2.4.2, je pense qu'un message incendiaire à
Anthony Baxter s'impose :-)
Comment voulez-vous que python représente 5597564875 ?
5597564875
5597564875L




c'est donc un long qui est fourni automatiquement à partir du littéral
dans la mesure où on ne peut pas le représenter sur un int (de C).

Il n'y a pas photo c'est vrai, mais comme j'utilise cet operateur dans
un calcul de checksum c'est assez embetant car ce genre de calcul
tolere mal les approximations :)
Je ne vois pas le problème puisque vous pouvez systématiquement utiliser

des longs.



Avatar
FB
Merci les gars, maintenant je ne comprends meme plus ma question :)

J'ai bien un resultat qui correspond a mes attentes avec le truc de
Christophe (x & 0xFFFFFFFF) >> 13

Mais sur l'ensemble de l'algo ou y a aussi des +, - ~, <<, & et | le
resultat final est toujours aussi tordu...

En fait je voulais adapter ce code php qui permet de faire des requetes
google (
http://www.v7n.com/forums/coding-forum/26785-php-script-display-google-page-rank.html
)

Et pour l'instant, je n'obtiens pas les memes resultats avec le script
php et avec le script python... je ressayerais demain.