bon, en fait, tant qu'a faire, ca sera ptet plus clair pourquoi ca a ce comportement avec un exemple plus detaille:
le nombre
1011110100011101000111110000000000100100 en binaire
==
812237389860
structure d'un float IEEE754:
- 1 bit de signe
- 8 bits d'exposant
- 23 bits de mantisse + 1 bit implicite
[s][eeeeeeee][mmmmmmmmmmmmmmmmmmmmmmm]
pour convertir en float ce nombre:
1011110100011101000111110000000000100100
deja t'enleve le bit implicite:
(1)011110100011101000111110000000000100100
tu prends directement les 23 bits de mantisse:
[s][eeeeeeee][01111010001110100011111]
les bits perdus sont : 0000000000100100
ensuite, pour l'exposant, il faut compter le nombre de bits entre la virgule flottante (qui se trouve entre le bit implicite et le bit le plus significatif de la mantisse):
1.011110100011101000111110000000000100100
ca fait 39 bits
l'exposant a un bias de 127 (un exposant de 0 vaut 127, un exposant de -127 vaut 0 (et accessoirement, le nombre flottant devient un 'denormal', un nombre denormalise, on perd le bit a '1' implicite... bref)
donc les 8 bits d'exposant valent 127 + 39 = 10100110
[s][10100110][01111010001110100011111]
et c'est un nombre positif, donc le bit de signe est a 0:
[0][10100110][01111010001110100011111]
ce qui fait au final que le float vaudra:
(1)01111010001110100011111 0000000000000000
==
812237389824
EDIT: btw, j'ai dit une connerie dans le post d'avant, quand je disais "+127 ou -127 bits autour de zero", en fait c'est +126 ou -127, l'exposant qui vaut 127 (donc avec tous ses bits a 1) est une valeur speciale pour representer les infinis et les NaN, suivant les patterns de bits dans la mantisse. (de tete, les infinis doivent avoir les bits de la mantisse a 0, et les NaN doivent avoir au moins un bit a 1, le pattern exact permettant apres de differencier les differents types de NaN.. bref)
</horssujet>