Go Down

Topic: Dove sbaglio ? (Read 189 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): Se vuoi il mio aiuto dimostrami almeno che hai letto il nostro "aiutateCi ad aiutarVi"

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-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 e SWITCH non sono cicli !!! *****
** Una domanda ben posta è già mezza risposta **
*** La corrente si misura in mA, la quantità di carica in mAh ***

Zamundo

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

Go Up