Проблемы вычисления и печати long unsigned integer (длинных целых чисел без знака)
У меня есть этот код, который выдает ошибочное длинное число без знака.
КОД:
char buff[100];
int unsigned long bytes;
bytes = 48 * 70 * 144;
sprintf(buff,"%lu bytes\n", bytes);
BTPort.print(buff);
ВЫХОД: 20088 байт
НО: правильное значение - 483840
@Willem Ferguson, 👍1
1 ответ
▲ 2
Это происходит потому, что числовой тип по умолчанию - int
, который на Arduino составляет всего 16 бит (и подписан).
Так что 48 * 70 * 144 0x76200 в шестнадцатеричном формате, который усечен до 16 бит, равен 0x6200 или 25088. Это вычисление выполняется препроцессором, а не компилятором, поэтому он не знает (или не заботится) о типе целевой переменной.
Вам нужно заставить значения вычисляться как unsigned long, добавив к ним UL:
bytes = 48UL * 70UL * 144UL;
,
@Majenko
Смотрите также:
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino с 12-битным ЦАП (MCP4725) не работает
- Избегайте математических вычислений с плавающей запятой, чтобы ускорить Arduino
- Странное явление с avrdude: stk500v2_ReceiveMessage(): таймаут только с ATmega250 на windows 7x64
- Проанализировать большой ответ json с помощью ESP8266
- Сбой Arduino во время последовательной печати без очевидной причины
- Будет ли адаптер питания 12В постоянного тока, 1А подавать слишком большую мощность и повредит Arduino Mega 2560?
- функция eval() для Arduino?
Спасибо, что уделили мне время, это было чрезвычайно полезно., @Willem Ferguson
Достаточно даже заставить одно из значений быть длинным без знака. -байт = 48UL*20*144;, @DataFiddler