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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
"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 ?
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
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
"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 ?
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...
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) )
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...
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)
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." <anonymous@discussions.microsoft.com> a écrit :
n'est pas plus simple d'utiliser un calcul ( calculer le complément sur 32
bits devrait réussir)
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)