简单的操作。计算时间延迟。
const unsigned long C1 = 30 * 1000;
const unsigned long C2 = (300 * 1000)/C1; // must be = 10
void setup() {
Serial.begin(57600);
Serial.println("\n-------");
Serial.print("C1 = "); Serial.println(C1);
Serial.print("C2 = "); Serial.println(C2);
unsigned long V1 = (300 * 1000)/C1; // must be = 10
Serial.print("V1 = "); Serial.println(V1);
long V2 = (300 * 1000)/30000; // must be = 10
Serial.print("V2 = "); Serial.println(V2);
int V3 = (300 * 1000)/30000; // must be = 10
Serial.print("V3 = "); Serial.println(V3);
}
void loop() {
}在监视器控制台中打印的Arduino UNO:
怎么啦?
发布于 2016-02-06 23:08:58
预计300 * 1000将给出30'0000,或以十六进制表示的0x493E0。但是当您编写(300 * 1000)时,Arduino使用16位有符号整数算术,因此结果被截断为0x93E0 (或十进制为-27680 )。
然后,当您除以一个无符号长时,结果将转换为无符号长,这将给出0xFFFF'93E0或十进制中的。
除以30,000,你得到143'164。
对于V2,它是相同的:(300 * 1000) = -27680在16位签名算术中,-27'680 / 30'000给出。
https://stackoverflow.com/questions/35245427
复制相似问题