Всякий раз, когда вы пишете уравнение на C / C ++, типы данных, с которыми вы работаете, оказывают реальное влияние на вывод уравнения.
Каждый тип, как int
, float
и unsigned long
имеет различное поведение, и занимает определенное количество места в памяти для хранения.
int
(в arduino) хранится в 16 битах, половина значений дана для отрицательных чисел, половина - для положительных значений, а одна - для 0. Это дает диапазон -2 ^ 15 (-32,768) до + 2 ^ 15-1 (32 767).
unsigned long
(на Arduino) составляет 32 бита, но ни один не обозначен как отрицательный. его диапазон составляет от 0 до 2 ^ 32-1 (4294967295).
Что за математика? Какой другой тип обработки исключен при работе с миллис?
Суть проблемы в том, что время, когда возвращается миллис, когда-либо превышало 32767, и вы пытались сохранить его в int, arduino не мог этого сделать, потому что не int
может удерживать такое большое число. Тип математики, который является недопустимым, - математика, которая применяется к меньшим типам данных, а не к каким-либо конкретным операциям. Может быть, эти примеры помогут:
int i = 32767;
Serial.println(i);
//No problems here; it fits just fine
32767
i = 32767 + 1;
Serial.println(i);
//Oh no, the value didn't fit
-32768
unsigned long fake_millis = 42000;
i = fake_millis;
Serial.println(i);
//This is an example of millis going past an int
-23536
i = -10;
unsigned int j = i;
Serial.println(j);
//no way to put a negative number in an unsigned value
65526
uint32_t k = fake_millis;
Serial.println(k);
//unsigned long is a uint32_t on arduino; this works great!
42000
То, как это реализовано, действительно гениально; Если вас интересует, откуда взялись эти числа и почему они распространяются так, как они есть, вам следует обратиться к тем же объяснениям представлений чисел в двух дополнениях.