首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >乘法除法。怎么啦?

乘法除法。怎么啦?
EN

Stack Overflow用户
提问于 2016-02-06 19:28:08
回答 1查看 276关注 0票数 0

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

代码语言:javascript
复制
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)

怎么啦?

EN

回答 1

Stack Overflow用户

发布于 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给出。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35245427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档