Java résultats diffèrent for (int)Math.pow(2,x) et 1<<x

Pourquoi les deux opérations suivantes aboutissent à des résultats différents en Java pour x = 31 ou 32 mais les mêmes résultats pour x=3?

int x=3;
int b = (int) Math.pow(2,x);
int c = 1<<x;

Résultats:

x=32: b=2147483647; c=1;
x=31: b=2147483647; c=-2147483648;
x=3:  b=8         ; c=8
Une subtile différence, c'est que pow() est beaucoup plus lent, même si la réponse est la même. pow() a erreur d'arrondi, tandis que int a débordement. Vous pouvez essayer de 1L << 32 ce qui équivaut à 2147483648

OriginalL'auteur kasavbere | 2012-05-02