Liczba postów: 2
Liczba wątków: 1
Dołączył: Mar 2023
Reputacja:
0
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
Liczba postów: 877
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
42
11-03-2023, 17:15
(Ten post był ostatnio modyfikowany: 11-03-2023, 17:16 przez Jarewa0606.)
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ą.
Liczba postów: 2
Liczba wątków: 1
Dołączył: Mar 2023
Reputacja:
0
Dzięki za odpowiedź.
A taki przykład :
println(5 * 40000) da nam 200000 czyli wynik dobry a powinien być zły...
Pozdrawiam
Liczba postów: 67
Liczba wątków: 1
Dołączył: Aug 2018
Reputacja:
7
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.