Newsgroup: it.comp.lang.visual-basic
Titolo: moltiplicare 2 numeri Hex in VB6.. si puo'?

come da oggetto.. si posso fare operazioni in Hex?
Ho 2 numeri in decimale... trasformandoli in Hex ottengo le relative
stringhe.. come le moltiplico?.. non ditemi di moltiplicare in decimale e
trasformare in Hex per favore :-))))...
mi occorre proprio prima trasformarli in hex e poi moltiplicarli.. chi mi
aiuta?
Grazie

 ha scritto nel messaggio
news:uw6f9.2441$Oz2....@twister2.libero.it...

la prima cosa che mi viene da rispoderti e':
ma che cosa stai dicendo?
decimale ed esadecimale sono solo
diverse rappresentazioni a nostro uso e consumo,
la cpu le operazioni le esegue sui numeri binari, in base 2 cioe',
quindi:
riformula la domanda!
bye
R

 wrote in message news:uw6f9.2441

Concordo con quanto detto da Nerone.
Forse intendevi chiedere "come converto una stringa che rappresenta un
numero in esadecimale nel suo corrispondente valore decimale?"
Dim l As Long
l = Val("&H" & strHex)
Ciao

Sicuramente  mi sono espresso male .. per chiarire faccio un esempio...
l'operazione e' questa... - 786387015 * 354785449= -278998670204544735....
Trasformando in hex
-278998670204544735 con la calcolatrice di win ottengo 9A6D921 che
ritrasformato in decimale mi da 161929505. Il problema e' che (forse) vb6
non permette di trasformare
-278998670204544735 in hex... almeno io non ci sono riuscito cosi volevo
fare direttamente in hex il prodotto dei 2 fattori - 786387015 * 354785449
sperando di ottenere 9A6D921.

 sperando di ottenere 9A6D921.
No, allora non ci siamo proprio, aveva ragione Nerone :)
1) -278998670204544735 => 0xFC20CC3009A6D921
2) 0x9A6D921 => 161929505
Ammesso questo ribadisco anch'io che stai commettendo un bell'errore
concettuale se credi che un numero espresso in esadecimale sia diverso dallo
stesso espresso in decimale.
Sarebbe come dire che un litro d'acqua è meno di 10 decilitri solo perchè 1
< 10.
Ripassa prima le basi dell'aritmetica :P
Ciao
--
' // Initialize the expression evaluator
Engines.Evaluator = CreateObject("
http://www.neodatatype.net
")
' // you can find resources for and from the NG here!
Me.SitoComune = "
http://www.it-lang-vb.it
"

 ha scritto nel messaggio
news:zhuf9.10160$6O4.1...@twister1.libero.it...

e' la calcolatrice di win che sbaglia! (che strano)
la funzione Hex() del VB accetta come valori limite
-
2147483648
 e 
2147483647
tu penserai: chi cavolo ha deciso questi valori cosi' balenghi?
in esadecimale sono:
0x80000000 e 0x7FFFFFFF
ancora meglio, in binario sono:
10000000 00000000 00000000 00000000
e
01111111 11111111 11111111 11111111
in pratica quei valori sono
 -2^31 per i valori negativi e
  2^0 + 2^1 + 2^2 + 2^3 + 2^4 ... 2^30
 (equivalente a 2^31 - 1) per i valori positivi
e rappresentano i limiti del tipo _Long_
Penso che per chi vuole programmare, sapere queste cose sia
come sapere se la propria auto va a benzina o a gasolio.
e' fondamentale!
bye
R

 Ripassa prima le basi dell'aritmetica :P
Mi curero' di farlo .. ma non ho ancora risolto il mio problema :-))))
Ciao

Forse Andrea vuol usare il formato esadecimale perché ha scoperto che così
può rappresentare valori molto grandi e senza problemi di segno.
E sia pure!
In realtà implementare una routine che esegue calcoli su stringhe che
contengono valori esadecimali è complesso almeno quanto fare la stessa cosa
con stringhe che contengono valori decimali (si fa come ci hanno insegnato a
scuola, con il riporto etc.)
Io credo di aver capito perché hai intrapreso questa strada, ma è piuttosto
impervia. Ti conviene usare variabili di tipo double (che reggono
tranquillamente il carico da te richiesto) e poi usare una funzione di
formattazione (magari te la scrivi se quelle di vb non ce la fanno) se il
tuo problema è che vuoi che alla fine il risultato non sia visualizzato in
notazione scientifica - è questo il problema? Tu vuoi vedere
278998670204544735 e non 2.78998670204545E+17? Perché se non è questo,
allora il problema si riduce a dover usare il tipo double anziché il long.
--
rumplestiltskin


Purtroppo non e' solo un problema di visualizzazione... vorrei proprio
trasformare 278998670204544735 (risultato di un operazione) in
Hex...0xFC20CC3009A6D921

 Hex...0xFC20CC3009A6D921
se vuoi convertire un valore qualsiasi in esadecimale puoi
usare questa funzione:
Function myHex(ByVal Decimale) As String
Dim sTmp As String
Dim dVal
Dim bSegno As Boolean
Dim iNumCifre As Integer
    If IsNumeric(Decimale) Then
        ' memorizzo il segno
        bSegno = (Decimale < 0)
        ' converto la parte intera positiva
        dVal = Int(Abs(CDec(Decimale)))
        If bSegno = True Then
            dVal = dVal - 1
        End If
        Do Until dVal = 0
            If bSegno = True Then
                sTmp = Hex$(15 Xor (dVal - Int(dVal / 16) * 16)) + sTmp
            Else
                sTmp = Hex$(dVal - Int(dVal / 16) * 16) + sTmp
            End If
            dVal = Int(dVal / 16)
        Loop
        iNumCifre = Len(sTmp)
        If bSegno = True Then
            ' se il valore era negativo
            If Left$(sTmp, 1) < "8" And iNumCifre > 0 Then
                sTmp = "F" + sTmp
                iNumCifre = iNumCifre + 1
            End If
            ' i valori negativi vengono sempre considerati
            ' minimo, interi a 2 byte
            Select Case iNumCifre
            Case 0
                sTmp = "FFFF"
            Case 1, 2
                sTmp = String(4 - iNumCifre, "F") + sTmp
            Case 3, 7, 15
                sTmp = "F" + sTmp
            Case 5, 6
                sTmp = String(8 - iNumCifre, "F") + sTmp
            Case 9 To 14
                sTmp = String(16 - iNumCifre, "F") + sTmp
            Case Is > 16
                sTmp = String(32 - iNumCifre, "F") + sTmp
            End Select
        Else
            If iNumCifre = 0 Then sTmp = "0"
        End If
        sTmp = "0x" + sTmp
    End If
    myHex = sTmp
End Function
HTH
bye
R

 Hex...0xFC20CC3009A6D921
Siccome il numero massimo ottenibile in Hex in VB  è 16^7, fatti una
funzione che controlla se il tuo valore è maggiore di &h10000000, e nel caso
lo divide per (16^7).
Ogni volta prendi la parte decimale del risultato e la rimoltiplichi in modo
da ottenere le 7 cifre meno significative, e la parte intera la ripassi alla
funzione nel caso sia maggiore di 16^6+1.
Poi riassembli tutti i gruppi di cifre esadecimali che hai ottenuto, da
destra verso sinistra, ed ecco pronto il risultato.
Se non ti è chiaro, chiedi che cerco di spiegarmi meglio.
Ciao
*Roby*

 Dim dVal
.... FAVOLOSOOOOOOOOOOO !!!!!!!!
Provato e funzionante..... Grazie Nerone .. ti ringrazio di cuore... da solo
non ci sarei mai arrivato o ci sarei arrivato dopo lungoooooooooo tempo
:-))) Grazie ancora