Errore in semplice moltiplicazione

Dal codice ottengo come risultato p=4294958080 invece di 384000

...

unsigned long p; 

void loop() 
{
p=32*12000;
Serial.println(String(p));
lcd.print("p="+String(p));
while(true){}; 
}

Non capisco cosa succede ???.
Buona giornata
Giorgio Padoan

Perché il compilatore è subdolo e moltiplica due interi con segno, prova così:

p=32UL*12000UL;

Così forzi il compilatore ad interpretare 32 non come byte o int ma come unsigned long e dovresti ottenere il risultato desiderato

padoang:
Dal codice ottengo come risultato p=4294958080 invece di 384000

Che è esattamnete ciò che devi ottenere visto che, come ti ha spiegato fabpolli, NON hai specificato il tipo di numeri che stai usando, per cui ... per il 32 basta un byte, per il 12000 basta un int, il compilatore, per ottimizzare, fa la moltiplicazione tra due int e tronca il risultato a 16 bit segnati (int) ...

32 x 12000 dovrebbe dare 384000 che in hex è 0x5DC00, ma ... dato che un int è 16 bit segnato, viene troncato e diventa 0xDC00, numero NEGATIVO che vale, in decimale, -9216 che, in seguito, tu sposti in un unsigned long, che è di 32 bit non segnati e che quindi viene portato come 0xFFFFDC00 che, alla fine, in decimale da esattamente 4294958080.

Come vedi ... una minima disattanzione può provocare disastri :smiley: :smiley: :smiley:

Guglielmo

@padoang, Io aggiungo una domanda perchè sono curioso,
Perchè nel programmino di esempio che hai fatto hai usato la conversione in quella schifezza di String?
Nel forum sempre sconsigliamo di usare le String

Beh oltre a mettere semplicemente un cast esplicito "p=(long)32*12000;" (funziona anche con UL ma per me è più leggibile "(long)" di "UL" :wink: ), direi che devi evitare le String, sia perché qui
Serial.println(String(p));
è inutile, sia perché su Arduino va proprio evitato anche solo di pensare alle "String"... :wink:

l'ho messo per provare non capendo cos'era