Dove sbaglio ?

Ciao carissimi bentrovati.

Nello sviluppare un progetto più complesso mi sono imbattuto in qualcosa che non riesco a comprendere.

Nel listato che segue devo estrarre le singole cifre da un numero long.

Quando estraggo la quarta cifra succede qualcosa di strano:
kk anzicchè mostrare il corretto valore 40000 mostra l'inspiegabile -25536

Dove sbaglio ?

Grazie

long num=12345678;

void setup() {
Serial.begin(9600);
}

void loop() {
  

int k = num / 10000 % 10;

long kk=(k*10000);

Serial.print("k: ");
Serial.println(k);
Serial.print("kk: ");
Serial.println(kk);


}

Prova a usare long anche per k

Semplice, sbagli qui: long kk=(k*10000);

Stai moltiplicando un int (16 bit) per 10000 ed il risultato è superiore al valore che può entrare in un int (la tua moltiplicazione è tra due int, solo il risultato viene messo nel long).

La forma per farla funzionare è: long kk=((long)k * (long)10000); ... così dichiari la moltiplicazione tra due long.

Guglielmo

P.S. La cosa più pulita è fare quanto suggerito da Standardoil e dichiarare anche k come long, senza tanti cast

Zamundo:
kk anzicchè mostrare il corretto valore 40000 mostra l'inspiegabile -25536

Non è inspiegabile, la rappresentazione binaria di 40000 è la stessa di -25536, se usi una variabile 'int' (16 bit con segno) il massimo valore positivo è 32767, se superi questo massimo entri nei numeri negativi, il risultato è corretto :wink:

Python lo conferma:

>>> print(bin(40000 & 0xFFFF))
0b1001110001000000
>>> print(bin(-25536 & 0xFFFF))
0b1001110001000000

Perfetto. Grazie tantissimo ragazzi !!!