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
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
Dzięki za odpowiedź.
A taki przykład :
println(5 * 40000) da nam 200000 czyli wynik dobry a powinien być zły...
Pozdrawiam
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.