Всем привет, начал осваивать работу с платформой ардуино и столкнулся с интересным эффектом при математических операциях с разными типами данных, решения проблемы в статьях Гайвера не нешел (или смотрел плохо). Суть:
есть цикл
uint32_t r;
for (byte z = 1; z <= 255; z++){
r = z*1000;
}
на счетчике z=33 r становится равным 4294934760 (результаты вывожу через Serial)
на z=66 r=464
пробовал на разных ардуинках - результат тот же
работает корректно
for (byte z = 1; z <= 255; z++){
r = z*100;
r= r*10
}
при замене типа данных счетчика с byte на uint16_t
for (uint16_t z = 1; z <= 255; z++){
r = z*1000;
}
при счечике z=66 r=464
все корректно работает только при замене счетчика на uint32_t
for (uint32_t z = 1; z <= 255; z++){
r = z*1000;
}
но зачем мне менять тип с 1байта на 4, если мне в цикле нужно сделать всего 255 итераций
Так же интересна ситуация с возведением в степень:
uint32_t r;
r = pow(10,3); все корректно = 1000
byte z=3;
r = pow(10,z); = 999?
byte z=8;
r = pow(10,z); = 99999968?
r = pow(10,8); = 100000000
Буду благодарен, если обьясните почему это происходит и как с этим бороться
есть цикл
uint32_t r;
for (byte z = 1; z <= 255; z++){
r = z*1000;
}
на счетчике z=33 r становится равным 4294934760 (результаты вывожу через Serial)
на z=66 r=464
пробовал на разных ардуинках - результат тот же
работает корректно
for (byte z = 1; z <= 255; z++){
r = z*100;
r= r*10
}
при замене типа данных счетчика с byte на uint16_t
for (uint16_t z = 1; z <= 255; z++){
r = z*1000;
}
при счечике z=66 r=464
все корректно работает только при замене счетчика на uint32_t
for (uint32_t z = 1; z <= 255; z++){
r = z*1000;
}
но зачем мне менять тип с 1байта на 4, если мне в цикле нужно сделать всего 255 итераций
Так же интересна ситуация с возведением в степень:
uint32_t r;
r = pow(10,3); все корректно = 1000
byte z=3;
r = pow(10,z); = 999?
byte z=8;
r = pow(10,z); = 99999968?
r = pow(10,8); = 100000000
Буду благодарен, если обьясните почему это происходит и как с этим бороться