Ma parole comment VB traite-t-il les entiers ????

cs_kelly Messages postés 55 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 9 septembre 2004 - 31 août 2003 à 01:03
cs_kelly Messages postés 55 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 9 septembre 2004 - 31 août 2003 à 12:28
HELP ! Dites moi tout ce que vous savez au sujet de la gestion des entiers par VB ! Je suis perdu sans type non signé style (WORD ou DWORD) et il faut que je comprenne comment contourner le problème si possible.
Voici un bout de code révélateur de mon problème. Je ne veux justement pas définir a en tant que long.
Merci d'avance.

Dim a As Integer, b As Long
a = &HFF00
Print "&H" + Hex(a) 'je vérifie que a vaut &HFF00, ouf !
b = CLng(a) 'petite conversion forcée même si inutile
Print "&H" + Hex(a Or &HFF000000) 'me sort &HFFFFFF00
Print "&H" + Hex(b Or &HFF000000) 'me sort &HFFFFFF00

4 réponses

Proger Messages postés 248 Date d'inscription vendredi 10 novembre 2000 Statut Membre Dernière intervention 19 décembre 2008
31 août 2003 à 02:05
vb6 gère les entier de la façon suivante :

sur 1 octet (type Byte) : non signé
sur 2 octets (type Integer) : signé
sur 4 octets (type Long) : signé

pour ne pas "changer" de signe, une variable "integer" doit être comprise entre 0h et 7fffh, une "long" entre 0h et 7fffffffh.
le seul moyen de "s'en sortir au-dela" est d'utiliser a fond les opération booléenne et un un petit peu de maths pour "redresser" le signe... exercice peu amusant, je te l'accorde.
avoir la valeur de (par exemple) b = f4a56e17h il faut d'abord faire
temp = b and &h7fffffff
avec temp de type currency (par exemple) ou double
puis
temp = temp + 2^31

etc etc etc ...

dans ton exemple, je ne comprend pas ce que tu fais : tu veux pas définir "a" en tant que long, mais tu veux que a soit égal à ffffff00h ???
0
cs_kelly Messages postés 55 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 9 septembre 2004
31 août 2003 à 12:12
J'ai pensé en effet à me compliquer un peu la vie pour arriver à mes fins, mais ce problème m'est apparu justement dans un projet ou la performance compte : je recois d'une dll que j'ai écrite en C++, deux entiers 16 bits non signés que je veux tout simplement recoller (hi/lo) pour récupérer une code couleur 32 bits.
Dans mon exemple, je veux que a vale &HFF00FF00 et rien d'autre :) J'ai l'impression que la fonction Hex() travaille comme si l'argument était non signé, alors qu'en VB tous les entiers sont signés. Ce qui est contredit par le fait que PSet(x,y),&HFF00 fait un point turquoise (&HFFFFFF00) (il suffit de taper &HFF00& pour avoir le vert attendu, mais c'est pas logique...)
Je sèche quoi...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
31 août 2003 à 12:20
Print "&H" + Hex(a) 'je vérifie que a vaut &HFF00, ouf !
b = CLng(a) 'petite conversion forcée même si inutile
Print "&H" + Hex(a And &HFFFF)
Si tu veux verifier les 2 octets bas faut pas placer ceux du haut dans le masque qui se fait avec And et non Or qui complemente.
BruNews, ciao...
0
cs_kelly Messages postés 55 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 9 septembre 2004
31 août 2003 à 12:28
en effet ça marche en masquant ainsi, mais j'avoue que le fonctionnement interne de vb ne m'apparait pas plus clair.

merci encore !
0
Rejoignez-nous