Mot non signé

Résolu
cs_nabulio54 Messages postés 13 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 6 décembre 2008 - 5 août 2006 à 10:58
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 7 août 2006 à 10:01
Je débute avec VB6. J'ai plutôt tendance à programmer en Delphi.
Question bête: Comment fait on pour déclarer une variable en 16 bits non signés (integer en VB étant 16 bits signés). Je n'arrive pas à trouver dans l'aide.
Autre question: Quel sont les fonctions en VB pour faire des décalage de bits à gauche ou à droite ( l' équivalent de SHL ou SHR en delphi je crois).
Merci à celui qui répond

14 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 août 2006 à 11:14
Dsl, ne bataille pas plus longtemps, les nombres non signés n'existent tout simplement pas en VB6

En VB6, il n'y a pas non plus de fonctions de décalage de bits tout simplement parce que VB ne sait pas travailler avec les bits.

Seule méthode :
- Pour un décalage vers la gauche de x bits : multiplication par 2^x
- Pour un décalage vers la droite de x bits : division par 2^x

Sevyc64  (alias Casy)<hr align="center" size="2" width="100%" /><stron></stron># LE PARTAGE EST NOTRE FORCE #
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 août 2006 à 17:27
Bon alors je vais essayé de répondre dans l'ordre, sans trop me perdre.
"une variable que l'on envoie sur un port". Peut importe de la variable, il s'agit d'une donnée que l'on transmet à un périphérique externe via un port en l'occurence ici série (ou RS232) met ça aurait pu etre USB, FireWire, RS422, PcMcia,.........

Dans le cas présent, le port série RS232 n'accepte que des données de type octet (char) ou suite d'octets (string), les données sont transmises octet par octet. Donc Nabulio avec son mot, il ne peut pas l'envoyer directement, il est obligé de le découper en 2 octets pour transmettre ensuite chaque octet l'un après l'autre sous forme de caractère.

Pourquoi 50000 tout simplement parce que Nabulio donne ce chiffre dans sa réponse, et qu'en plus il est bien significatif du problème des nombres signés en VB.

Un mot signé (donc 16 bits signé) à pour plage de variation -32768 / 32767 (valeur représentée sur 15 bits)
Un mot non signé (donc 16 bits non signé) a pour plage de variation 0 / 65535 (valeur représentée sur 16 bits)

Donc 50000 peut etre réprésenté par un mot non signé (en C par exemple), mais ne rentre pas dans un mot signé comme en VB. Dans ce cas il faut passer sur un double mot.

Donc si tu veux travailler avec du "non signé" en VB, à partir du moment ou tu peux dépasser la moitié de la plage  "non signé", tu es obligé de prendre le type de variable suppérieur pour faire rentrer le nombre.

J'espère t'avoir éclairé un peu plus.

Sevyc64  (alias Casy)<hr align="center" size="2" width="100%" /><stron></stron># LE PARTAGE EST NOTRE FORCE #
3
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
5 août 2006 à 11:00
Salut,

peut-être que la réponse de Econs peut te satisfaire concernant les bits :

http://www.vbfrance.com/infomsg_DECALAGE-BIT_791187.aspx#2

@++

--Mortalino--
Le Mystérieux Chevalier "Provençal, le Gaulois"
0
cs_nabulio54 Messages postés 13 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 6 décembre 2008
5 août 2006 à 11:22
Merci pour les explications . Mais cela ne résout pas mon problème: Je dois envoyer sur un port série un mot de 16 bits qui peut avoir pour valeur décimal 50 000. Et je ne vois pas comment je peut faire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 août 2006 à 11:34
Déjà sur le port série tu ne peut envoyer que des octets soit 8 bits. Il faut donc que tu découpe ton mot en 2 octets pour pouvoir l'envoyer.

' Octet poid fort =  Décalage de 8 bits vers la droite + masque sur le poid faible

Octet1 = (TonMot / 256) 
AND &H0FF 

' Octet poid faible = Masque sur le poid faible du mot

Octet2 = TonMot 
AND &H0FF 

' Envoi des octets

Mscomm.Output = chr$( Octet1) & chr$(Octet2)

Sevyc64  (alias Casy) <hr align ="center" size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
5 août 2006 à 16:26
C'est pas faux !!

Humm au risque de passer pour un blaireau, c'est quoi tout ça !!
Envoyer un mot ? Ou ça ? Dans quel but ?

Désolé, mais je n'y connais rien en comm / port donc ça me ferait plaisir si qqun pouvait m'expliquer ces 'interrogations' !
Merci

(ps : " Octet1 = (TonMot / 256) 
AND &H0FF", Octet1 doit -être déclarer en quoi pour accepter ce genre de valeur ?)

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
5 août 2006 à 16:45
C'est quoi que tu pige pas mortalino ?

Octet1 et Octet2 peuvent etre déclaré en Byte (octet) même si souvent je les déclare en integer (mot en vb6). Cela n'a finalement que peu d'importance en VB6, il est tellement permissif.

TonMot sera obligatoirement au minimum un integer (ou short) et indiquera un nombre négatif pour les valeurs supérieures à &h7FFF (32767). Donc un integer n'acceptera jamais 50000 mais plutot -17232. Mais 50000 non signé et -17232 signé ont le même code hexa.
C'est pas clair mais en gros un mot non signé égal à 50000 en C s'il est passé en VB il deviendra signé et sera égal à -17232.

Sinon pour accepter 50000 TonMot doit etre déclarer en long (double mot soit 32 bits)

J'avais oublier de préciser que le 256 viens de 2^8 soit un décalage de 8 bits.

Question com je commence à avoir quelques années de galère dans ce domaine

Sevyc64  (alias Casy)
<hr align="center" size="2" width="100%" /><stron></stron># LE PARTAGE EST NOTRE FORCE #
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
5 août 2006 à 16:58
Ok merci, tes explications sont clairs. ils me reste 2 interrogations :

Pourquoi dans "TonMot", tu y place un nombre ? C'est quoi 50 000 ?(ou du moins, ça correspond à quoi)
J'ai bien compris le truc du Integer et du Long, mais qu'elle est la différence entre une variable (VB) signée & une variable (que l'on doit envoyer dans un port) non signée ?

Sinon, j'ai également bien compris le coup de la division par 256.

Merci Casy 

@++

   Mortalino
Le mystérieux chevalier, "Provençal, le Gaulois"
0
cs_nabulio54 Messages postés 13 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 6 décembre 2008
5 août 2006 à 17:56
Merci pour toutes ces explications
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
6 août 2006 à 11:12
Salut Casy,

c'est parfait, je pense que l'on ne pouvait faire plus explicite.

Je te remercie beaucoup. ;)

++
mortalino
0
Dolphin Boy Messages postés 630 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 17 février 2007
6 août 2006 à 17:51
Salut, l'explication de Casy est effectivement parfaite mais je vais remettre une couche pour ceux qui se sentent mal à l'aise avec le terme "mot" :

"mot" est la traduction française de "word" (jusque là n'importe quel dictionnaire le dira) qui désigne, en informatique, un type de donnée de 16 bits (2 octets) soit un integer en vb6.
De même "double-mot" = "dword" qui désigne un type de donnée de 32 bits (4 octets) soit un long en vb6 (voire un single ou un object mais dans ces cas le codage est différent).

Les aléas des traductions françaises du jargon informatique américain. Traduire "word" par mot, pourquoi pas ? C'est logique mais dans ce cas pourquoi ne pas traduire "bug" par "punaise" au lieu de "bogue" ?

HiHi, c'était juste une apparté, bonne prog à tous !
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
6 août 2006 à 21:02
Merci Dolphin.

Et je vais rajouter une chose que je n'ai pas dit jusqu'à maintenant.

Le terme integer (ou int en C) devrait être  banni de tout langage informatique. C'est ce que l'on appelle un faux ami
Suivant les machines, les OS et les langages,  une variable integer n'a pas la même taille. Elle peut faire 8, 16, 32 ou 64 bits.
Elle fera 16 bits sur un système Windows 32 bits sous VB6 mais 32bits sous VC6.
En C sous système 16 bits (Windows 3.1) elle fesait 16 bits. Sur un système 64 bits en C elle devrait normalement faire 64 bits.
Le terme integer devrai être banni au privilège des termes exact qui sont Short (ou Word) et Long (ou DWord).
Et attention avec . NET, la taille des variables a completement changée alors que les termes ont été conservés, histoire d'ajouter à la confusion.

Et Dolphin (et les autres) connais-tu l'origine du terme "bug" en informatique ? C'est une belle anecdote, je trouve.

Sevyc64  (alias Casy)<hr align="center" size="2" width="100%" /><stron></stron># LE PARTAGE EST NOTRE FORCE #
0
cs_nabulio54 Messages postés 13 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 6 décembre 2008
7 août 2006 à 09:37
L'origine du terme"bug"?


Mon prof d'informatique me l'avait expliqué un jour. Que je me rappelle....


Au début de l'informatique( fin 40, début 50), les ordinateur fonctionnaient avec des lampes,commutateurs,etc... 


Un jour, dans un centre de recherche américain, une panne d'un de ces ordinateurs a été provoqué par une sale bête. En effet,un cafard(bug en anglais) logé dans un contact(ou quelque chose comme ça) empêchat un liaison électrique de s'établir. Le technicien qui a trouvé l'origine de la panne a rédigé un très célébre rapport ou il a noté dans la case "origine de la panne: BUG". Et depuis c'est devenu le responsable de tous les malheurs de tous les informaticiens de la planéte. J'ai souvenir que mon prof avait fait circuler une copie de ce fameux rapport. Si je le retrouve, je vous ne manquerai pas de vous le faire parvenir.
Voilà, j'espère ne pas mettre trop planté!
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
7 août 2006 à 10:01
Bravo nabulio, une vrai encyclopédie.
Tu as réussi ton examen, tu as droit à ton diplome

Sevyc64  (alias Casy)<hr align="center" size="2" width="100%" /><stron></stron># LE PARTAGE EST NOTRE FORCE #
0
Rejoignez-nous