Newsgroup: it.comp.lang.visual-basic
Titolo: Sommare 2 variabili a 16 bit

mi sono perso nei meandri dei bit. Ho un contatore con 2 dataword il primo č 
il dataword basso ed il secondo il dataword alto tutti č due sono valori a 
16 bit. Pertanto quando carico i 2 valori mi ritrovo con 2 variabili 
contenenti 2 valori a 16 bit. Come fare per ritrovarmi una sola variabile 
con un valore a 32 bit (integer) In C avrei shiftato 16 bit verso destra per 
farli entrare nella parte alta della variabile finale. Ho provato con 
l'operatore >> o << ma ho tutta l'impressione che ne viene fuori un casino.
Si potrebbe effettuare un AND tra parte bassa e parte alta in questo modo 
FFFFFFFF ma il problema e che dovrei prima spostare i 16 bit del dataword 
alto nella parte alta della variabile che lo contiene (integer) e poi 
effettuare l'AND . In poche parole mi sono incasinato e non riesco a venirne 
fuori.
Grazie a tutti 

 fuori.
Proverei con una moltiplicazione per 65536 e poi una somma...
Alberto


a volte mi chiedo se ï¿œ necessario che di tanto in tanto non metta la testa 
sotto la sabbia e vada a nascondermi
che dire............non ho parole 

 che dire............non ho parole
Succede...
Basta che la variabile di destinazione della moltiplicazione abbia 
capienza per un FFFFFFFF positivo (ad esempio il long di VB6 non ce la 
farebbe perchè quel valore lo vede come negativo).
Alberto


dim value as integer(32bit con segno) o uinteger(32 bit senza segno) o long 
(64 bit con segno) o ulong(64 bit senza segno)
parliamo di 
vb.net
 2008
value=65536*65535+65535
parliamo di 2 valori a 16 bit da memorizzare in 32 bit con valore massimo di 
4.294.967.295 = FFFFFFFF
errore: overflow di un'operazione aritmetica
da msdn
integer
Contiene valori integer con segno a 32 bit (4 byte) in un intervallo 
compreso tra -2.147.483.648 e 2.147.483.647.
uinteger
Contiene valori integer a 32 bit (4 byte) senza segno in un intervallo 
compreso tra 0 e 4.294.967.295.
mi fermo qui perche ritengo inutile continuare sta di fatto che il programma 
va in'errore per overflow
 

 programma va in'errore per overflow
         Dim value As UInteger
         Dim v1 As UInteger = 65536, v2 As UInteger = 65535
         value = v1 * v2 + 65535
         MessageBox.Show(value.ToString)
se invece scrivessi
value = 65536 * 65535 + 65535
l'intellisense mi direbbe:
"espressione costante non rappresentabile nel tipo integer"
ciao
stefano

 va in'errore per overflow
Certo, non ti ho appena scritto che l'unica accortezza che devi avere ï¿œ 
che la variabile di destinazione sia sufficientemente capiente?
E la variabile temporanea intermedia che viene usata per la 
moltiplicazione di due Integer, ï¿œ un Integer...
Basta castare (che brutto verbo) anche i passaggi intermedi.
Oh, ragazzi, stiamo parlando di uno shift binario e di uso 'base' dei 
tipi, non possiamo perderci su queste cose...
Alberto

 compreso tra -2.147.483.648 e 2.147.483.647.
Aggiorno quanto scritto ieri:
         Dim value As UInteger
         value = CType(65536, UInteger) * CType(65535, UInteger) + 65535
         MessageBox.Show(value.ToString)
ieri notte ero un po' fuso (lo scricchiolio delle dita sui vetri si 
sente?) ed effettuavo u cast stile csharp per cui mi dava errore :-)
In effetti il cast c-style è molto più elegante:
             uint value;
             value = (uint)65536 * (uint)65535 + 65535;
             MessageBox.Show (value.ToString());
ciao
stefano