Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Неправильный вывод умножения в тинкеркад

Александ Кукутэ Ученик (170), на голосовании 5 месяцев назад
Когда я пишу просто 193200, то у меня оно выводится, но если писать через умножения пишет -3408
Вот сам код:

long rmp=0;
rmp=966*200;

Serial.println(rmp);
Я уже не знаю что делать...
Голосование за лучший ответ
kaiu Высший разум (117220) 6 месяцев назад
Возможно по умолчанию тип int для чисел...а этот тип может быть и 2 байта и 4 и 8 и тд, все от битности зависит той системы (а, так это же Arduino и оно по 2 бита точно будет)
Так что 193200 это в битах
11110010 10110000
или F2B0
или что тоже самое в десятичном -3408
У вас тип long а если написать unsigned long rmp = 0; то по идее он должен вывести верно без минусов.
Ну или так
long rmp=0;
rmp= ((long)966)*200;
или так
long rmp=966;
rmp *= 200;
Шрэк Зелёный Гуру (3318) 6 месяцев назад
Проблема, с которой вы столкнулись, связана с переполнением переменной типа `long` в Arduino. По умолчанию, тип `long` в Arduino имеет размер 32 бита и может хранить числа от -2,147,483,648 до 2,147,483,647. Когда вы пытаетесь присвоить переменной `rmp` результат умножения 966 на 200, результат (193,200) находится в пределах допустимого диапазона.

Однако, если вы видите отрицательное число, это может быть вызвано тем, что переменная `rmp` была объявлена в другом месте кода и уже содержала отрицательное значение из-за переполнения, или же результат умножения был неправильно интерпретирован системой.

Вот исправленный вариант кода:


 long rmp = 966L * 200L; // Используйте суффикс L для обозначения long 

Serial.println(rmp);

Убедитесь, что вы используете суффикс `L` после чисел, чтобы указать, что они должны быть обработаны как значения типа `long`. Это поможет избежать переполнения и гарантировать, что умножение будет выполнено правильно. Попробуйте этот исправленный код и посмотрите, решит ли это вашу проблему. Если проблема остается, проверьте, нет ли других частей кода, которые могут влиять на значение `rmp` до этой операции умножения.
Похожие вопросы