乘法,除法。怎么了?

时间:2016-02-06 19:28:08

标签: arduino arduino-uno

简单的操作。计算时间延迟。

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在显示器控制台中打印:

  • C1 = 30000(ok)
  • C2 = 143164(必须= 10)
  • V1 = 143164(必须= 10)
  • V2 = 0(必须= 10)
  • V3 = 0(必须= 10)

有什么问题?

1 个答案:

答案 0 :(得分:3)

300 * 1000 预计会以十六进制表示 30&#39; <00> 0x493E0 。 但是当你写(300 * 1000)时,Arduino使用 16位有符号整数算术,因此结果被截断为 0x93E0 (或 - 以十进制表示的27680。

当你除以无符号长整数时,结果将转换为无符号长整数,这会给出 0xFFFF&#39; 93E0 4&#39; 294&#39;&#39;&#39; 616 十进制。

除以30&000;你得 143&#39; 164

对于 V2 ,它是相同的:16位带符号算术中的(300 * 1000)= -27680和-27&#39; 680/30&000; 000给出 0