Newsgroup: it.hobby.elettronica.digitale
Titolo: somma bit in c

salve
come si fa in c a sommare due variabili da 8 bit da formare cosi una
variabile da 16?
valore= 0x89 + 0xFF;  //giusto????
via ringrazio anticipatamente
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Eistono vari modi...
Questo è uno:
- Suppongo che le variabili <A> e <B> siano di tipo int (8 bit)
- Supongo che la variabile <C> sia di tipo long (16 bit)
C=A;
C<<=8;  // Shift a sinistra di 8
C+=B;
oppure
C=B;
C<<=8;
C+=A;
Dipende a quale variabile (A,B) vuoi assegnare il peso maggiore. Nel primo
esempio ad <A>, nel secondo a <B>
Ciao!

 variabile da 16?
Due variabili ad 8 bit sommate al massimo fanno una variabile da 9 
bit. Se intendi invece unire un MSB ed un LSB la formula è 
256*MSB+LSB
-- 
From C:\*.* to shining C:\*.*
News 2000 [v 2.06] / StopDialer / PopDuster - 
http://www.socket2000.com
Akapulce portal: 
http://www.akapulce.net

 256*MSB+LSB
Sicuro?
Se la variabile MSB è ad 8 bit quando la moltiplichi "al volo" per 256 non è
detto che il risultato sia rappresentabile con 8 bit (anzi, non lo è quasi
sicuramente)
Quindi se MSB è ad 8 bit devi prima assegnarla ad una varibile a 16 bit e
poi moltiplicare
Ciao!

sto provando a fare la conversione A/d con il pic16f877
valore = adresl+(adresh<<8);   //adresl e adresh sono da 8
mi ritrovo il valore a 10 bit??? valore lo dichiarato come int


sto provando a fare la conversione A/d con il pic16f877
valore = adresl+(adresh<<8);   //adresl e adresh sono da 8
mi ritrovo il valore a 10 bit??? valore lo dichiarato come int
-- 


> valore = adresl+(adresh<<8);   //adresl e adresh sono da 8
 L'errore è proprio qui!
Quando fai lo shift a sinistra (<<) di 8 il risultato temporaneo viene
memorizzato su "adresh" che però è ad 8 bit e quindi non potrà contenere il
risultato che è a 16 bit. Capito?
La soluzione è questa:
long valore;
valore=adresh;  // adresh è ad 8 bit
valore<<=8;  // va bene perchè "valore" è a 16 bit
valore+=adresl;
Siccome usi un PIC senza moltiplicatore hardware, la soluzione va bene con
lo shift. Se invece usi un PIC con 8x8 hardware multiplier, anzichè lo shift
a sinistra di 8 ti conviene una moltiplicazione per 256.
Inoltre la risoluzione di conversione è impostabile: se scegli 10 bit è
chiaro che la variabile che conterrà il risultato avrà 6 bit non utilizzati.
Ci dovrebbe essere un'opzione per decidere se allineare il risulato a
sinistra oppure a destra
Ciao!

 Sicuro?
Quella è la formula generale. Il risultato è un numero 
rappresentabile con 16 bit.
-- 
The attention span of a computer is only as long as its power cord.


 ha scritto nel messaggio
news:82f5c0aa3a031b561c3...@mygate.mailgate.org...


 rappresentabile con 16 bit.
D'accordo! Il risultato è a 16 bit ma sbagliato perchè quando moltipliche
per 256 il risultato parziale viene memorizzato in una variabile ad 8 bit
che non può contenerlo...
Ciao!

 > Quella è la formula generale. Il risultato è un numero

Per quel che conosco di C so che si possono anteporre tra parentesi 
le conversioni dirette es: a=(int)a*256, non saprei nei compilatori 
PIC.
-- 
Honey, I Formatted the Kid!


 a=(int)a*256
rettifica: a=(int)b*256
-- 
SCCS, the source motel!  Programs check in and never check out!" - Ken Thompson


 ha scritto nel messaggio
news:AYmCc.371245$hc5.16...@news3.tin.it...


 PIC.
Verissimo! Si chiama casting e fa parte delle direttive ANSI C.