![]() ATOUTFOX COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO Visual FoxPro : le développement durable |
|||||||||||||
|
|||||||||||||
des entiers et des bits
|
|||||||||||||
|
|||||||||||||
www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2025. |
Vous dites à la fin de votre article :
"cet exemple illustre aussi les bugs de VFP concernant le bit de signe. Si vous tentez d'enregistrer une valeur entière strictement supérieure à 0x7FFFFFFF FWRITE() se plantera."
Je ne suis pas d'accord. Les fonctions BinToC et CToBin sont correctes.
D'abord il est vrai que VFP ne sais pas trop ce qu'est un entier sur 4 octets.
Si on écrit
x = 0xFFFFFFF
x n'est pas égal à -1 mais à 4294967295 (2^32-1)
Or BinToC( x, 4) n'accepte x qu'entre -2^31 et 2^31-1
Il n'y a pas de bug dans les fonctions BinToC et CToBin, mais elles sont un peu obscures.
Le deuxième argument est plutot une chaine qu'une valeur numérique.
Ex: BinToC( -1, '4S' ) est tout à fait correct car on précise que la valeur est signée avec le S.
Avec '1S' on peut appeler BinToC de -128 à 127
Avec '2S' on peut appeler BinToC de -32768 à 32767
Avec '4S' on peut appeler BinToC de -2^31 à 2^31-1
En réalité dans la mémoire les octets sont rangés du poids faible au poids fort. C'est la raison pour laquelle si l'on veut écrire pour être lu par d'autres langages il vaut mieux utiliser BinToC( -1, '4SR' ) le 'R' pour reverse.
CToBin marche bien lui aussi (Cf la classe CStream dans Dvfp publié il y a deux semaines)