Bất cứ khi nào bạn viết một phương trình trong C / C ++, các kiểu dữ liệu được vận hành trên có ảnh hưởng rất thực đến đầu ra của phương trình.
Mỗi loại thích int
, float
và unsigned long
có các hành vi khác nhau và dành một khoảng trống nhất định trong bộ nhớ để lưu trữ.
int
. đến + 2 ^ 15-1 (32.767).
unsigned long
(trên arduino) là 32 bit, nhưng không có bit nào được chỉ định là âm. phạm vi của nó là 0 đến 2 ^ 32-1 (4294967295).
Loại toán nào? Những loại xử lý khác được loại trừ trong khi làm việc với millis?
Mấu chốt của vấn đề là thời gian quay trở lại đã qua 32767 và bạn đã cố lưu nó trong một int, arduino không thể làm điều đó, bởi vì int
không thể giữ được con số lớn như vậy. Loại toán học vượt quá giới hạn là toán học xảy ra với các loại dữ liệu nhỏ hơn, không phải bất kỳ hoạt động cụ thể nào. Có thể những ví dụ này sẽ giúp:
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
Cách thức thực hiện này thực sự khá thiên tài; Nếu bạn quan tâm đến việc những con số này đến từ đâu và tại sao chúng lại tràn ra theo cách chúng làm, bạn nên xem xét các giải thích tương tự về biểu diễn số bổ sung của hai.