Newsgroup: it.comp.lang.visual-basic
Titolo: &H7FFE: che roba è?

&H7FFE: che roba č?
grazie.
dickie

Significa 32766...in esadecimale
&H sta appunto per esadecimale
7F FE sono due byte che tradotti in decimale fanno 32766
Gianni Moretti

Gianni Moretti

Sospettavo si trattasse di un numero esadecimale. Ma...
*******************
' By:
' Domenico Statuto
' Night Eagle
' Marco Carnazzo
' Ettore Maronese (By -MES-)
'
    [supercut]
TempNum = 0
    I = 1
    Do
        ' I DISPARI
        AppoNum =
InStr("B1A0KKPPLLC2QQD3RRE4VVOOSSF5TTG6UUH7MMI8NNJ9WWZZYYXX", Mid(TxtCodFis,
I, 1))
        TempNum = TempNum + ((AppoNum - 1) And &H7FFE) / 2
        I = I + 1
        If I > 15 Then Exit Do
        ' I PARI
        AppoNum =
InStr("A0B1C2D3E4F5G6H7I8J9KKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ", Mid(TxtCodFis,
I, 1))
        TempNum = TempNum + ((AppoNum - 1) And &H7FFE) / 2
        I = I + 1
    Loop
    TempNum = TempNum Mod 26
************
Questo è uno stralcio di codice per il calcolo della lettera di controllo
(la 16.esima) di un codice fiscale.
Ho scaricato il codice dal sito comune e non riesco a capire come funzioni
il confronto bit per bit fra 'AppoNum - 1' e il valore '32766'.
Mi chiedo soprattutto perché 32766.
il frammento di codice in esame è:  (AppoNum - 1) And &H7FFE
Ti ringrazio della risposta.
dickie

Mi chiedo soprattutto perché 32766.
]zac[

Della Bianca Giuseppe

Che stupido che sono!
Ho riflettuto sulla cosa e sono arrivato alla conclusione che si tratti
proprio di un confronto bit per bit fra variabili di tipo Integer, cioè a 16
bit (2 byte).
Una variabile di tipo Integer può memorizzare un valore non superiore a
32767 (&H7FFF) proprio perché questo equivale alla sequenza di bit
1111111111111111, che è la sequenza massima per 2 byte.
Per memorizzare il valore 32768 è necessario disporre di una variabile più
grande, a 4 byte, ovvero long.
Ecco, dunque, perché 32766!
Inoltre un confronto bit per bit si comporta in questo modo:
- è possibile fra 'tipi' uguali, cioè integer con integer ecc.
- and esegue un confronto fra i biti che occupano la medesima 'posizione'
nella sequenza binaria.
- opera restituendo vero o falso (cioè 0 o 1) secondo le classiche regole
del confronto logico (in questo caso, eseguito appunto dall'operatore
'and' ):
    0 and 0 = 0
    0 and 1 = 0
    1 and 0 = 0
    1 and 1 = 1
Ne consegue che i primi quindici confronti (bit per bit nella stessa
posizione) fra una qualunque variabile di tipo Integer e il numero 32766,
ovvero la 'variabile' 1111111111111110 lascerà inalterati i primi 15 bit e
modificherà l'ultimo solo nel caso in cui questo sia 0.
esempio: 0000000000000001 and
              1111111111111110 =
              0000000000000000
Ciò perché solo l'ultimo bit 'subisce' il confronto 1 and 0 = 0.
Infine se l'ultimo bit è 0, il numero è positivo, altrimenti è negativo.
Tutto ciò vale anche per gli altri operatori logici (OR e XOR), che però
eseguiranno il confronto sui bit secondo le loro 'regole'.
Ho deciso di postare queste considerazioni (mi auguro valide) per
correttezza verso tutti gli altri (infondo ho posto una questione al NG e
quest'ultimo merita una soluzione) e nella speranza di una smentita anche
parziale, laddove avessi commesso qualche errore.
Grazie a Gianni e a Dbg per l'attenzione alla questione.
dickie

proprio di un confronto bit per bit fra variabili di tipo Integer, cioč a
16
]zac[


mumble mumble.
Interessante osservazione, di cui faccio tesoro.
MSDN chiama "confronto bit per bit" ciň che tu chiami "operazione logica" o
sono due cose diverse?
Mi spiace mettere in discussione ciň che mi si dice, d'altra parte non č
possibile comprendere come funzionino certe cose senza un atteggiamento
critico di base.
Naturalmente, a seguito di questa scelta, merita un ringraziamento doppio la
tua pazienza.
dickie
N.B.: fra l'altro ciň che ho scritto presenta alcuni errori formali e
sostanziali, che non so ancora correggere con sicurezza.
Ad esempio la questione dei numeri negativi e positivi e del perché opero
un'operazione logica col valore &H7FFE (il cui corrispondente valore binario
č 111111111111111 -15 cifre binarie-) e non con il valore &HFFFE ( il cui
corrispondente valore binario č 1111111111111111 -16 cifre binarie-).
Oppure il valore &H7FFE  corrisponde a 0111111111111111 ? Mah!

sono due cose diverse?
Allora, per operazione logica si intende genericmente quelle operazioni in
AND, OX, XOR, ecc... per cui
valore1 operando valore2 = {valore1|valore2}
oppure
operando valore1 = {valore1|valore2} (es. NOT True)
le operazioni Bit a Bit sono un sottogruppo delle logiche.
Poniamo 1 = True e 0 = False si anno le stessu uguaglianze di cui sopra.
Attenzione perň a non confondere le due cose: se un'operazione bit-a-bit č
un'operazione logica non si puň dire del contrario!
11 AND 01 (operazione bit a bit)
1 AND 0 (operazione logica e bit a bit)
True AND False (operazione logica)
NOT 1 = False (confronto, contenente operzaione logica)
Prova a fare quest'ultima operazione con un compilatore serio tipo per C e
questo ti riderŕ in faccia.
VB č un bonaccione e te lo lascia fare perchč la interpreta cosě:
NOT True = False
Farebbe meglio a insultarti anche lui.
Con un'operazione cosě nel tuo prog c'č da preparare la pistola per spararsi
nei c******i.
Provare per credere:
Debug.Print Not 1 = False 'risultato True
Debug.Print Not 1 ' risultato -2
Ma come? -2 = True?
In realtŕ VB vede come True tutto quello che č <>0.
Allora prova questo:
Debug.Print (3 and 1) = True ' risultato False
Ma... non abbiamo appena detto che <>0 = True?
Questo qui sopra č come dire 1 = True... se (1 <> 0) = True perchč allora mi
dŕ False?
Boh, allora non č vero! Allora (3 and 1) = False!
Proviamo
Debug.Print (3 and 1) = False ' risultato False
Beh?
Confuso?
Allora impara a usare le espressioni logiche e i confronti bit a bit in modo
separato.
Ciao

 Ciao
Ciao, Zanna e grazie.
dickie


In realta' questo dipende dal geniale typecasting di VB, che casta a caz...
a caso nella maggior parte delle operazioni.
Infatti 3 and 1 = True viene castato (internamente, sia chiaro, non si
sognerebbe mai di farti capire...) in
CInt(3 AND 1) = CInt(True)
Mentre
Not 1 = False
Viene castato in
Not (CBool(1)) = False
Perche'?
Forse lo sanno a Redmond, di sicuro non qui.
Il fatto e' che a volte devi prestare tu attenzione a come fai il lavoro,
accertandoti di mettere in chiaro se vuoi un'operazione LOGICA booleana (e
allora usi CBool) o una operazione ALGEBRICA booleana (e allora usi
variabili a parte e non metti alcun confronto fino a quando non ti serve).
Del tipo:
-- confronto logico
If CBool(A) And CBool(B) Then
-- operazione algebrica, verifica sul risultato
C = A And B
If C <> 0 Then
Teoricamente anche
If (A And B) <> 0 Then
Funzionerebbe, ma poi occhio a debuggare per bene questa linea di codice,
che nella vita c'e' sempre qualcuno alle tue spalle, e di solito non e' li'
per pulirti la giacca... Natalino Balasso docet! :)
Ciaotutti,
Alessandro

In realta' questo dipende dal geniale typecasting di VB, che casta a caz...
vorrai dire che "castra" un caz... :)
In effetti, ogni tanto, in VB si sente la mancanza di un buon sistema di
typecasting (che è ben diverso dalle varie funzioni di _conversione_
CBool(), CInt() e quant'altro)
Ciao

 CBool(), CInt() e quant'altro)
d'accordissimo :(
--
Fibia "Sakamoto" FBI
E-mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Sito Personale: 
http://www.geocities.com/fibiafbi
VB Simple: 
http://vbsimple.virtualave.net
Membro #25 delle Mitiche Brigate Takahashi sezione Sud

 wrote in message
news:hiBi6.10115$LM4.1...@twister1.tin.it...

In effetti... Ho visto delle funzioni C con prototipo dei parametri void,
che si aspettavano che il chiamante castasse le sue variabili verso void (in
particolare era un'implementazione del quicksort, che si aspettava i
classici dati del quicksort) al momento della chiamata...
Ottimo per l'equivalente di As Any e ti costringe cmq a pensare a quello che
stai facendo, cosa che As Any non richiede.
Tra parenti, e' vero che anche C# non avra' piu' accesso diretto alla
memoria? Che fanno, levano i puntatori??
Se e' vero mi rimetto subito a lavorare alla configurazione del mio KDE...
Qualcuno sa come si faccia a convincerlo che BACKSPACE e' BACKSPACE e non
DEL? Ci ho provato per tutta ieri sera ma non trovo nessuna opzione in
merito, e il fatto strano e' che le console in solo testo funzionano
correttamente...
Ciaotutti,
Alessandro

 correttamente...
Tanto per restare in tema.... di OT parlo, che avevi capito
io non riesco a fargli capire che i numeri sul tastierino numerico sono
numeri. NumLock acceso o spento mi fa sempre le freccette. In KDE
naturalmente.
