Conversione da Int a Byte

Ho caricato questo sketch sul mio amato Arduino;

void setup() {

Serial.begin(9600);
int i;
for( int s=0;s<=10;s++)
{
i=random(30000); //numero a caso

  Serial.print("dec: ");
  Serial.print(i);
  Serial.print("    byte:  ");
  Serial.println(byte(i)); //conversione in byte 
}
}
void loop() {
  
}

L’output è il seguente (i numeri sono random)

dec: 16807    byte:  167
dec: 25249    byte:  161
dec: 10073    byte:  89
dec: 13658    byte:  90
dec: 28930    byte:  2
dec: 21272    byte:  24
dec: 17544    byte:  136
dec: 878    byte:  110
dec: 27923    byte:  19
dec: 27709    byte:  61
dec: 4440    byte:  88

Ma non riesco a capire come avviene la conversione da int a byte… vengono perse delle informazioni?
Mi potete spiegare?
Grazie

insomma... un byte (che poi è una variabile unsigned char) può contenere valori decimali da 0 a 255 perché è grande 8 bit. Quando fai la conversione da un int vengono presi solo i primi 8 bit a partire da dx (parte dal LSB).

Stai cercando di mettere un valore a 16 bit (l'int) in uno largo solo 8 bit (il byte).
Non è un'operazione di conversione ma di "troncamento", ossia la parte in eccesso va persa.

leo72:
Stai cercando di mettere un valore a 16 bit (l'int) in uno largo solo 8 bit (il byte).
Non è un'operazione di conversione ma di "troncamento", ossia la parte in eccesso va persa.

Ah, ho capito.
Ho utilizzato questo metodo per salvare i codici del telecomando IR nella EEPROM.
(nel mio topic precedente)

usa

oppure

Arduino Playground - EEPROMWriteAnything per accedere ai singoli byte di una variabile con un puntatore.

usa la librereia EEPROMex.h
http://playground.arduino.cc/Code/EEPROMex

Ciao Uwe

Volendo, se si integra la libreria Eeprom.h della toolchain, si possono usare anche altri metodi per leggere/salvare dati in Eeprom.
http://www.nongnu.org/avr-libc/user-manual/group__avr__eeprom.html
(PS: non tutti sono supportati dalla toolchain attuale di Arduino, che è basata su una versione vecchia di binutils).

#include <avr/eeprom.h>
//per leggere un intero (2 byte):
int a = eeprom_read_word ((uint16_t *)indirizzo);
//per salvare un intero (2 byte)
eeprom_write_word((uint16_t *)indirizzo, intero);