• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
problem z mnożeniem
#1
Witam
Kolega pisząc program trafił na dziwny problem. Zapytał czy się spotkałem z czymś takim.



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

void loop() {
  Serial.println(60 * 1000);
  delay(5000);   
}



daje wynik:
-5536

Dlaczego tak jest ?


Pozdrawiam
Piotr
 
Odpowiedź
#2
Nie ma problemu po prostu nie rozumiecie...

Serial print/ln przyjmuje int-2 bajty liczba z przedziału -32 768 do 32 767 , twoje mnożenie zmiennych int daje wynik 60000 jak widzisz nie da się liczby 60000 zapisać do zmiennej która ma max 32 767 następuje Integer overflow (poczytaj o tym).

Żeby to dobrze policzyło musisz zrobic zrzutowanie (zmiana zmiennej) albo określic zmieną "A" o pojemności unsigned int lub long / unsigned long wtedy

unsigned int A =60;
Serial.println(A * 1000);

Da poprawny wynik
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
Dzięki za odpowiedź.

A taki przykład :

println(5 * 40000) da nam 200000 czyli wynik dobry a powinien być zły...

Pozdrawiam
 
Odpowiedź
#4
Program "widzi", że używasz liczb większych niż int i sobie uzupełnia to co programista sam tam powinien wpisać.
Możesz zapisać liczbę 60 albo 60ul albo 60u, albo rzutować wynik (uint32_t)(60 * 1000).
Program, kompilator, czy prekompiler, na różnych etapach może wychwycić takie błędy w zapisie, a waszym zadaniem jest nie wyręczać się takimi pomocami, bo nie zawsze automat przewidzi, co programista miał na myśli.
To samo będziecie mieli z float, liczbę 60 czasami trzeba zapisać jako 60.0, by program zrozumiał, że liczymy na floatach.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości