Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

"magic numbers" en 32 ou 64 bits ?

5 réponses
Avatar
Octavio
Bonjour,

s'il vous pla=EEt, pouvez vous me dire si les "magic numbers" suivants
sont cod=E9s en 32 ou 64 bits ?

...
#define MSK_MANT_IBM 0xffffff
#define MSK_EXP_IBM 0x7f000000
#define MSK_SIGN_IBM 0x80000000
#define MSK_NORM_IEEE 0x800000
#define MSK_NO_SIGN 0x7fffffff
#define MSK_MANT_IEEE 0x7fffff
#define MSK_EXP_IEEE 0x7f800000
#define MSK_SIGN_IEEE 0x80000000
#define MSK_NORM 0x1000000
...

Ils sont utilis=E9s pour faire du bitwise AND avec des variables de type
registre entier pour calcul d'exposant, de mantisse et de signe. Pour
une raison l'application ne calcule pas l'exposant comme souhait=E9.
L'application roule sur un ordinateur d'architecture x86_64 (64 bits)
sur plateforme Linux SUSE11.1.

Merci.

Octavio

5 réponses

Avatar
Pascal J. Bourguignon
Octavio writes:

Bonjour,

s'il vous plaît, pouvez vous me dire si les "magic numbers" suivants
sont codés en 32 ou 64 bits ?



Compte les bits!

Pourquoi d'après toi s'amuse-t'on à écrire les nombres en base seize en
informatique?

C'est parce que chaque chiffre de la base seize correspond exactement à
quatre bits. Ainsi il y une correspondance directe entre les nombres
écrits en base seize et les nombres binaires:



0xffffff --> 1111 1111 1111 1111 1111 1111 24 bits
0x7f000000 --> 111 1111 0000 0000 0000 0000 0000 0000 31 bits
0x80000000 --> 1000 0000 0000 0000 0000 0000 0000 0000 32 bits
0x7fffffff --> 111 1111 1111 1111 1111 1111 1111 1111 31 bits
0x7fffff --> 111 1111 1111 1111 1111 1111 23 bits
0x7f800000 --> 111 1111 1111 0000 0000 0000 0000 0000 31 bits
0x1000000 --> 1 0000 0000 0000 0000 0000 0000 25 bits


Certains de ces masques semblent correspondre à des nombres IEEE 754 de
32 bits.



Ils sont utilisés pour faire du bitwise AND avec des variables de type
registre entier pour calcul d'exposant, de mantisse et de signe. Pour
une raison l'application ne calcule pas l'exposant comme souhaité.
L'application roule sur un ordinateur d'architecture x86_64 (64 bits)
sur plateforme Linux SUSE11.1.



Une variable de type registre entier, c'est n'importe quoi. Ça dépend
du compilateur (lequel peut se baser sur le processeur cible).


--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Avatar
Antoine Leca
Octavio écrivit :
s'il vous plaît, pouvez vous me dire si les "magic numbers" suivants
sont codés en 32 ou 64 bits ?



OEQLC?


#define MSK_MANT_IBM 0xffffff
#define MSK_EXP_IBM 0x7f000000
#define MSK_SIGN_IBM 0x80000000



Les flottants à la sauce IBM peuvent être sur 32 ou 64 bits. Les nombres
magiques sont les mêmes. Et oui, c'est fait pour.


#define MSK_NORM_IEEE 0x800000
#define MSK_NO_SIGN 0x7fffffff
#define MSK_MANT_IEEE 0x7fffff
#define MSK_EXP_IEEE 0x7f800000
#define MSK_SIGN_IEEE 0x80000000



Là, il s'agit de nombres flottants IEEE754 « double », sur 64 bits donc,
tels que vus en 32 bits par une machine ayant le même ordre des bits en
flottant et en entier, pour le mot de poids fort.


#define MSK_NORM 0x1000000



Aucune idée de ce dont il peut s'agir.


Ils sont utilisés pour faire du bitwise AND avec des variables de type
registre entier pour calcul d'exposant, de mantisse et de signe. Pour
une raison l'application ne calcule pas l'exposant comme souhaité.
L'application roule sur un ordinateur d'architecture x86_64 (64 bits)



Là où ta question devient franchement drôle, c'est que cette machine
utilise 32 bits pour les entiers (int). Donc sauf à vouloir se
compliquer la vie au-delà du raisonnable (genre en utilisant des long),
tu ne devrais avoir aucune différence avec un PC x86-32 « normal ».

Maintenant, le fait que tu aies des références à IBM (qui utilise
généralement des machines gros-boutiennes) me laisse flairer un problème
d'ordre plutôt que de nombre...


Antoine
Avatar
Pascal J. Bourguignon
Antoine Leca writes:

Octavio écrivit :
s'il vous plaît, pouvez vous me dire si les "magic numbers" suivants
sont codés en 32 ou 64 bits ?



OEQLC?


#define MSK_MANT_IBM 0xffffff
#define MSK_EXP_IBM 0x7f000000
#define MSK_SIGN_IBM 0x80000000



Les flottants à la sauce IBM peuvent être sur 32 ou 64 bits. Les nombres
magiques sont les mêmes. Et oui, c'est fait pour.


#define MSK_NORM_IEEE 0x800000
#define MSK_NO_SIGN 0x7fffffff
#define MSK_MANT_IEEE 0x7fffff
#define MSK_EXP_IEEE 0x7f800000
#define MSK_SIGN_IEEE 0x80000000



Là, il s'agit de nombres flottants IEEE754 « double », sur 64 bits donc,
tels que vus en 32 bits par une machine ayant le même ordre des bits en
flottant et en entier, pour le mot de poids fort.



Non. http://en.wikipedia.org/wiki/IEEE_754-2008
Les IEEE 754 sur 64 bits on un exponent sur 11 bits.
Comme je l'ai indiqué dans ma réponse, 0x7f8000000 n'a que 8 bits à 1,
donc c'est un masque pour des IEEE 754 sur 32 bits.


--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Avatar
Samuel DEVULDER
Le 26/05/2011 19:35, Antoine Leca a écrit :

#define MSK_NORM 0x1000000



Aucune idée de ce dont il peut s'agir.



Un masque pour les nombres dénormalisés?

sam.
Avatar
Samuel DEVULDER
Le 26/05/2011 21:25, Samuel DEVULDER a écrit :
Le 26/05/2011 19:35, Antoine Leca a écrit :

#define MSK_NORM 0x1000000



Aucune idée de ce dont il peut s'agir.



Un masque pour les nombres dénormalisés?



Hum.. non, pas ca!


sam.