[VBA Excel]Nombre hexa trop grand ?
Bonjour,
j'effectue une opération logique XOR entre un nombre valant &H01FFFFFF et d'autres nombres:
Pour &H01FFFFFF XOR un nombre inférieur à &H8000, tout va bien.
Pour &H01FFFFFF XOR un nombre supérieur à &H8000, j'obtiens des résultats négatifs.
Je pense que cela est dû à une limitation de capacité de bits.
Même en faisant:
Code:
&H01FFFFFF xor CLng(&H8000)
cela ne fonctionne pas. Pourtantque CLng représente un nombre sur 4 octets.
J'ai même essayé du :
Code:
CDbl(&H01FFFFFF) xor CDbl(&H8000)
ou du :
Code:
Cdbl( CDbl(&H01FFFFFF) xor CDbl(&H8000) )
...sans succès :roll:
C'est quoi l'astuce ?
j'avais laissé un _ (d'essai) au lieu de la variable montype ==>> corrigé
Re,
1) l'idée de philben mérite d'âtre saluée (Bravo à toi, philben)
2) j'ai malgré tout voulu m'amuser à mettre en oeuvre la méthode que je suggérais un peu plus haut (en passant par des chaines binaires sur 32 bits)..
Et j'ai un petit problème qui me laisse une espèce d'arrière-goût gênant ...
Le code qui suit est auto-explicite, ainsi que son exécution :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| Private Sub Command1_Click()
c1 = enbinaire(&H1FFFFFF, 32)
c2 = enbinaire(&H8000, 32)
MsgBox "voici mes 2 chaines en binaire " & vbCrLf & c1 & vbCrLf & c2
For i = 1 To 32
If Val(Mid(c1, i, 1)) <> Val(Mid(c2, i, 1)) Then chsortie = chsortie & "1" Else chsortie = chsortie & "0"
Next
MsgBox "voici ma chaîne de sortie" & vbCrLf & chsortie
MsgBox " et voici le résultat en décimal de ma chaine de sortie avec montype = 8" & vbCrLf & _
endecimal(chsortie, 8) & vbCrLf & vbCrLf & _
"et voici le résultat en décimal de ma chaine de sortie avec montype = 32" & vbCrLf & endecimal(chsortie, 32)
End Sub
Private Function endecimal(ByVal Chaine As String, montype As Integer) As Integer
Dim i As Integer
For i = 1 To montype
If Mid(Chaine, i, 1) = "1" Then endecimal = endecimal + (2 ^ (montype - i))
Next
End Function
Private Function enbinaire(ByVal nombre As Currency, nbbits As Integer) As String
Dim binaire As String, z As Currency, x As Currency
binaire = ""
z = 0
x = 0
Do Until nombre < 1
x = nombre - (Int(nombre / 2) * 2)
nombre = Fix(nombre / 2)
binaire = CStr(x) + binaire
Loop
If nbbits > Len(binaire) Then
binaire = String(nbbits - Len(binaire), Chr(48)) + binaire
End If
enbinaire = binaire
End Function |
Ma gêne est la suivante : doit-on examiner la valeur de sortie sur 8 bits (et j'ai alors le même résultat que philben) ou sur 32 (et j'ai alors un résultat différent)... ?