risultati errati del prodotto di interi con il numero 10000

Salve a tutti. Ho realizzato con Arduino Uno Rev. 3 e uno shild lcd un contalitri per la cisterna d'acqua di casa mia. Ha funzionato perfettamente tutto per mesi, dopo di che il dispositivo ha cominciato a dare "i numeri". Dopo diversi controlli ho capito che l'errore si verificava quando il sistema si trovava a dover moltiplicare un numero intero compreso tra 4 e 9 per il numero 10000. Ho estratto il tutto in un piccolo sketch:

long prova;
void setup() 
{
  Serial.begin(9600);
}
void loop() {
  prova=100*2;
  Serial.println(prova);
  delay(3000);  
  prova=1000*3;
  Serial.println(prova);
  delay(3000);
  prova=10000*8;
  Serial.println(prova);
  delay(3000);
  prova=100000*5;
  Serial.println(prova);
  delay(3000);  
}

in effetti il monitor seriale restituisce

200
3000
14464
500000

in corrispondenza del prodotto 10000*8 il risultato è errato e lo stesso si verifica se moltiplico 10000 per un qualsiasi intero di una cifra diverso da 1, 2 e 3.
Non è strano? Sarà sicuramente una banalità e mi scuso per questo.

seriron:
in corrispondenza del prodotto 10000*8 il risultato è errato e lo stesso si verifica se moltiplico 10000 per un qualsiasi intero di una cifra diverso da 1, 2 e 3.
Non è strano? Sarà sicuramente una banalità e mi scuso per questo.

Il tipo dato int può rappresentare solo numeri compresi tra 32768 e -32767, o usi gli "unsigned int", valore compreso tra 0 e 65535, oppure usi i "long int", o gli "unsigned long int", per valori maggiori di 65536 come sembra essere il tuo caso.

se fai
prova=100008;
il numero 10000 viene considerato un int e percui una moltiplicazione per 8 produce un overflow anche se il risulato viene memorizzato in una variabile long.
Soluzione: la lettera "L":
prova=10000L
8L;

Ciao Uwe

Grazie 1000. Domani provo a correggere il codice dello sketch contalitri. A questo punto ho solo un dubbio:
come mai quando do come codice "prova=1000005" quindi un numero ancora più grande invece il risultato
è corretto "500000" come mostra l'esempio stesso indicato. Non sarebbe dovuto andare anche questo in overflow
essendo il risultato un intero come nel caso di 10000
8?

Il compiler usa il tipo di variabile piú piccola possibile per memorizzare il numero..
10000 entra in un INT a 16 Bit e percui viene usato 16 Bit per memorizzarlo e calcolare il risultato della moltiplicazione..
500000 entra solo in un LONG a 32 Bit e percui il risultato della multiplicazione non fa un overflow.

Ciao Uwe