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

Nombres signés / non-signés

3 réponses
Avatar
Louis
Arrggg !

Je m'arrache les cheveux depuis un moment avec ces nombres signés.

Exemple j'ai un entier (16 bits donc) contenant &HFFFF. Sa valeur est donc -1.
Je l'affecte à une variable longue (32 bits donc). Sa valeur est toujours -1, ce qui
équivaut à &HFFFFFFFF. Jusque là c'est logique.

Maintenant je veux que tous les bits du nombre entier se retrouvent à la même
place lorsque j'affecte la valeur de l'entier à la variable longue. Pour cela j'essaye
de faire une opération bit à bit du genre: LongVar = &H00000000& OR IntegerVar.
En espérant obtenir &H0000FFFF
Mais j'obtiens toujours -1, c'est à dire &HFFFFFFFF.
:-((

Bref y-a-t-il moyen de travailler directement au niveau du bit, donc avec des nombres
non-signés sous VB ?

3 réponses

Avatar
Zoury
Salut Louis! :O)

voici une couple de macro C++ traduit pour VB, posté par Harvey Triana :

Private Function LOWORD(ByVal DWORD As Long) As Integer
LOWORD = DWORD And &HFFFF
End Function
Private Function HIWORD(ByVal DWORD As Long) As Integer
HIWORD = (DWORD And &HFFFF0000) &H10000
End Function
Private Function HIBYTE(ByVal WORD As Integer) As Byte
HIBYTE = (WORD And &HFF00) &H100
End Function
Private Function LOBYTE(ByVal WORD As Integer) As Byte
LOBYTE = WORD And &HFF
End Function
Private Function MAKELONG(ByVal HIWORD As Integer, ByVal LOWORD As Integer)
As Long
MAKELONG = (CLng(HIWORD) * &H10000) Or (LOWORD And &HFFFF)
End Function
Private Function MAKEWORD(ByVal HIBYTE As Byte, ByVal LOBYTE As Byte) As
Integer
MAKEWORD = (CInt(HIBYTE) * &H100&) Or (LOBYTE And &HFF)
End Function

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

"Louis" a écrit dans le
message de news:40fea974$0$9353$
Arrggg !

Je m'arrache les cheveux depuis un moment avec ces nombres signés.

Exemple j'ai un entier (16 bits donc) contenant &HFFFF. Sa valeur est


donc -1.
Je l'affecte à une variable longue (32 bits donc). Sa valeur est


toujours -1, ce qui
équivaut à &HFFFFFFFF. Jusque là c'est logique.

Maintenant je veux que tous les bits du nombre entier se retrouvent à la


même
place lorsque j'affecte la valeur de l'entier à la variable longue. Pour


cela j'essaye
de faire une opération bit à bit du genre: LongVar = &H00000000& OR


IntegerVar.
En espérant obtenir &H0000FFFF
Mais j'obtiens toujours -1, c'est à dire &HFFFFFFFF.
:-((

Bref y-a-t-il moyen de travailler directement au niveau du bit, donc avec


des nombres
non-signés sous VB ?




Avatar
David C.
n'est pas plus simple d'utiliser un calcul ( calculer le complément sur 32
bits devrait réussir)

exemple en 8 bits, un nombre négatif est calculé comme étant le complément
à 2^8 (256)
donc -1 est codé comme étant: 256 - 1 = 255 = FF

256 - 1 mis dans unevariable avec 16 bits devrait normalement donné 00FF

donc sauf si j'ai mal compris ton problème, tu devrais juste avoir besoin
d'une soustraction
(du moins d'une addition en utilisant ta variable négative: 256 + (-1) )

bon, adapte à la bonne puissance de 2...
Avatar
Louis
C'est bon j'ai effectivement fait des calculs pour y arriver. C'est finalement assez
simple mais je n'y voyais pas clair avec cette histoire de nombres signés/non-signés.

Ce que je voulais faire en fait c'est compresser une suite de données particulières
en casant 3 nombres dans des "bit fields" à l'interieur d'un mot de 16 bits. L'un de
ces nombres pouvait être négatif, les 2 autres étant toujours positifs.

Merci à toi et à Zoury.

"David C." a écrit :
n'est pas plus simple d'utiliser un calcul ( calculer le complément sur 32
bits devrait réussir)