Go Down

Topic: Dove si trova la funzione byte() (Read 1 time) previous topic - next topic

astrobeed


Io volevo vedere come avviene il casting di un Int in un Byte per sapere se togliendo la mascheratura succedono problemi.


Il casting di un int un un byte avviene semplicemente troncando gli otto bit superiori, molta attenzione al fatto che se int contiene un valore negativo il casting verso un unsigned char (byte) porta inevitabilmente a valori errati per via del modo in cui i numeri negativi sono rappresentati in binario.

andrea86


Sinceramente non capisco a cosa serva, se devi fare un cast puoi usare la sintassi del c      vInt=(char)vCar;    ma attenzione a overflow!!!


Intendevi cChar = (char)vInt? Se sì, cos'è l' overflow?

andrea86



Io volevo vedere come avviene il casting di un Int in un Byte per sapere se togliendo la mascheratura succedono problemi.


Il casting di un int un un byte avviene semplicemente troncando gli otto bit superiori, molta attenzione al fatto che se int contiene un valore negativo il casting verso un unsigned char (byte) porta inevitabilmente a valori errati per via del modo in cui i numeri negativi sono rappresentati in binario.


Però astro io uso il unsigned int, in teoria da quello che ho capito ( il c l'avevo "studiato" a scuola quasi 10 anni fa... ) non dovrebbe avere il 15 bit per la storia se il numero è negativo o no.

astrobeed


Però astro io uso il unsigned int, in teoria da quello che ho capito ( il c l'avevo "studiato" a scuola quasi 10 anni fa... ) non dovrebbe avere il 15 bit per la storia se il numero è negativo o no.


Se usi gli unsigned int in valore contenuto può essere solo positivo, da 0 a 65535, quindi il problema legato ai valori negativi non c'è.

nid69ita

#19
Apr 11, 2013, 11:45 am Last Edit: Apr 11, 2013, 11:50 am by nid69ita Reason: 1


Sinceramente non capisco a cosa serva, se devi fare un cast puoi usare la sintassi del c      vInt=(char)vCar;    ma attenzione a overflow!!!

Intendevi cChar = (char)vInt? Se sì, cos'è l' overflow?


Si, la fretta a volte ....  :smiley-mr-green:

Nel tuo caso mi sembra la soluzione migliore la lowByte() che oltretutto rende anche il codice più leggibile rispetto a un mascheramento.
#define lowByte(w) ((uint8_t) ((w) & 0xff))
my name is IGOR, not AIGOR

andrea86


#define lowByte(w) ((uint8_t) ((w) & 0xff))


se non sbaglio da qui si vede in ritorno la variabile u char e all'interno della funzione la variabile che gli viene passata viene mascherata estrapolando solo i primi 8 bit.

ma perchè la mascheratura se tanto viene troncata dopo i primi 8 bit? bah, cmq per me non va bene in quanto i bit sono sfalzati: i primi 3 in una variabile e poi gli altri 8 in un altra.

nid69ita

La mascheratura serve perchè è solo una define, nessuno dice che tipo di variabile è w. Se è una in col segno almeno spiani via il bit del segno.

Negli esempi che hai fatto tu ai primi post, io non avrei tolto il mascheramento
Fai l'esempio del valore 0x56F  che in realtà è 0x056F  perciò dai per scontato che 4 bit sono a zero.
Ma la tua domanda è voglio essere certo che il codice giri in tutte le situazioni.
Allora io dico che non puoi essere certo che quei bit siano sempre a 0, mascherali con 0xF0 e poi fai shift di bit
my name is IGOR, not AIGOR

leo72


cmq per me non va bene in quanto i bit sono sfalzati: i primi 3 in una variabile e poi gli altri 8 in un altra.

8+3 = 11
ma sono 8 bit oppure 11?

All'inizio erano 3 da una parte e 5 dall'altra.
Code: [Select]
unsigned int cID = 0x56F;
unsigned char SIDH = cID >> 3;
unsigned char SIDL = cID << 5;


Facciamo così, prendiamo un unsigned int a 16 bit.
Quali sono i bit che ti interessano?
Li vuoi mettere tutti in un unico byte o no?

andrea86

ok lascero la mascheratura e poi faro' i shift dei bit. alla fine e' che volevo prendere d'esempio la funzione byte() ma guardero' la lowbyte().

nid69ita

Dopo un pò di ricerche, credo che la funzione byte() non esista, ma la sintassi C/C++ permetta di scrivere un cast anche in quella forma.
Provato solo compilando lo sketch ma non su Arduino. Nessun errore, il compilatore lo accetta
Code: [Select]

void setup()
{ int iv=10;
 char cv=char(iv);          // invece di char cv=(char)iv;
 byte cb=byte(iv);          // invece di byte cb=(byte)iv;
 long lv=long(iv);          // invece di long lv=(long)iv;
}

void loop(){}
my name is IGOR, not AIGOR

PaoloP

--> http://www.cplusplus.com/doc/tutorial/typecasting/
La notazione è diversa ma il significato il medesimo: fa il casting di una variabile/espressione.
Quindi la funzione byte() della domanda originale non è altro che un modo diverso per scrivere il casting.

Possiamo chiudere.  XD

andrea86

beh ho imparato un modo nuovo di fare casting: =(char)pippo

grazie a tutti per i vostri interventi

Go Up