Go Down

Topic: Dove sbaglio ? (Read 163 times) previous topic - next topic

Zamundo

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

Code: [Select]


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);


}
Che Arduino sia con Voi !

Standardoil

Prova a usare long anche per k
Prima legge di Nelson (che sono io): fai le stesse cose sempre alla stessa maniera, quegli errori li hai già corretti

Non bado a studenti, che vadano a copiare da un'altra parte

Se io ti domando e tu non mi rispondi vuol dire che non ti serve più

gpb01

#2
May 20, 2019, 05:03 pm Last Edit: May 20, 2019, 05:06 pm by gpb01
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
Search is Your friend ... or I am Your enemy !

Claudio_FF

#3
May 20, 2019, 05:29 pm Last Edit: May 20, 2019, 05:31 pm by Claudio_FF
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 ;)

Python lo conferma:
Code: [Select]
>>> print(bin(40000 & 0xFFFF))
0b1001110001000000
>>> print(bin(-25536 & 0xFFFF))
0b1001110001000000
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

Zamundo

Perfetto. Grazie tantissimo ragazzi !!!
Che Arduino sia con Voi !

Go Up