Pages: 1 [2]   Go Down
Author Topic: Dove si trova la funzione byte()  (Read 1546 times)
0 Members and 1 Guest are viewing this topic.
Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9494
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9494
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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'è.
Logged

ivrea (to)
Online Online
Faraday Member
**
Karma: 87
Posts: 4957
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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))
« Last Edit: April 11, 2013, 04:50:27 am by nid69ita » Logged

my name is IGOR, not AIGOR

Offline Offline
Full Member
***
Karma: 4
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

#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.
Logged

ivrea (to)
Online Online
Faraday Member
**
Karma: 87
Posts: 4957
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

my name is IGOR, not AIGOR

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22811
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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?
Logged


Offline Offline
Full Member
***
Karma: 4
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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().
Logged

ivrea (to)
Online Online
Faraday Member
**
Karma: 87
Posts: 4957
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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(){}
Logged

my name is IGOR, not AIGOR

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7123
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

--> 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.  smiley-lol
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Offline Offline
Full Member
***
Karma: 4
Posts: 150
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

grazie a tutti per i vostri interventi
Logged

Pages: 1 [2]   Go Up
Jump to: