Проблемы вычисления и печати 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

, 👍1


1 ответ


2

Это происходит потому, что числовой тип по умолчанию - int, который на Arduino составляет всего 16 бит (и подписан).

Так что 48 * 70 * 144 0x76200 в шестнадцатеричном формате, который усечен до 16 бит, равен 0x6200 или 25088. Это вычисление выполняется препроцессором, а не компилятором, поэтому он не знает (или не заботится) о типе целевой переменной.

Вам нужно заставить значения вычисляться как unsigned long, добавив к ним UL:

bytes = 48UL * 70UL * 144UL;
,

Спасибо, что уделили мне время, это было чрезвычайно полезно., @Willem Ferguson

Достаточно даже заставить одно из значений быть длинным без знака. -байт = 48UL*20*144;, @DataFiddler