Блин, это у меня ниже экрана было и я уже успел написать про это прежде, чем прочитать
Но, не зря я говорил, что если лишнее убрать, то заметится ещё что-нибудь. Заметилось!
Нельзя так беспечно относиться к остатку – он всегда имеет знак частного. Вот смотрите, я печатаю точно как Вы и точно с теми же типами данных – любуйтесь.
void setup(void) {
Serial.begin(9600);
const uint8_t _del = 10;
const int16_t & _value = -156;
const int16_t val = _value / _del;
const int16_t fract = _value % _del;
Serial.print(val);
Serial.print(".");
Serial.println(fract);
}
void loop(void) {}
// РЕЗУЛЬТАТ
// -15.-6
Вполне допускаю, что это не актуально в конкретной задаче, но тут дело глобальнее – нельзя привыкать так писать – эта привычка когда-нибудь подведёт, а ошибка-то подленькая – пока числа положительные, она не проявляется, так что заметите Вы её, когда в программе будет уже 100500 строк и когда этот участок Вы будете считать старым, давно и надёжно работающим. Просто на рефлексах должно быть – если числа знаковые, то аккуратно работаем с остатком.
Но, и это не всё. У меня тут было как-то эссе – крик души о крайне коварной привычке смешивать в одних операциях знаковые и беззнаковые числа (как у Вас _value
– знаковое, а _del
– беззнаковое). Вот, казалось бы, ну смешали Вы и смешали, “ачётакова?”. А Вот Вы попробуйте в моём примере (или у себя) поменять тип _del
с uint8_t
на uint16_t
– обещаю, что ахренеете от результата.