【问题标题】:Why do I get a negative number when adding two ints together whose sum is > 32k?为什么将两个整数加在一起且总和大于 32k 时会得到一个负数?
【发布时间】:2019-10-16 02:24:58
【问题描述】:

我有一个看起来很简单的问题,但我认为 Processing 中有些东西我不明白。问题是当我将两个整数相加并且最终数量> 32k时,数量变为负数。

看起来像一个溢出问题,除了处理引用状态

整数的数据类型,没有小数点的数字。整数可以大到 2,147,483,647,小到 -2,147,483,648。

这是有问题的代码和串行监视器输出:

int start_millis = millis();
int end_millis = start_millis + 5000;
  
Serial.println(start_millis);
Serial.println("");
Serial.println(end_millis);

还有监视器输出:

!---Motion Detected; Flicker starting ---!
17616
22616
!--- Flicker Over ---!

!---Motion Detected; Flicker starting ---!
22986
27986
!--- Flicker Over ---!

!---Motion Detected; Flicker starting ---!
29569
-30967

【问题讨论】:

  • 张贴,你会收到的。来自 Arduino 文档:在 Arduino Uno(和其他基于 ATmega 的板)上,一个 int 存储一个 16 位(2 字节)值。这会产生 -32,768 到 32,767 的范围(最小值为 -2^15,最大值为 (2^15) - 1)。

标签: c++ arduino integer processing overflow


【解决方案1】:

“整数的数据类型,不带小数点的数字。整数可以大到 2,147,483,647,小到 -2,147,483,648。”

什么是“处理参考”?它上面的说法是错误的

编辑: 如下所述, 语言中的声明是正确的,但您正在查看错误的手册。 Processing 不是 C 或 C++,因此检查其他语言的特性绝对是零意义

在 C 和 C++ 标准中,int 是一种具有至少 16 位的类型。在 8 位和 16 位架构中,出于明显的实际和性能原因,int 是 16 位类型。因此添加 2 个总和大于 32767 的数字会导致溢出(因为在这种情况下是 INT_MAX == 32767

来自 Arduino 文档:

在 Arduino Uno(和其他基于 ATmega 的开发板)上,int 存储一个 16 位(2 字节)的值。这会产生 -32,768 到 32,767 的范围(最小值为 -2^15,最大值为 (2^15) - 1)。在基于 Arduino Due 和 SAMD 的板(如 MKR1000 和 Zero)上,一个 int 存储一个 32 位(4 字节)的值。这会产生 -2,147,483,648 到 2,147,483,647 的范围(最小值为 -2^31,最大值为 (2^31) - 1)。

https://www.arduino.cc/reference/en/language/variables/data-types/int/

更多信息请阅读

【讨论】:

  • Processing 建立在 Java 之上,而不是 C 或 C++,所以它的 reference 是正确的。
  • 对,我是说 OP 很困惑,因为处理参考是针对 Java 的,但他们在 Arduino 上使用它,所以他们受 C++ 类型的支配,而不是 Java 类型。换句话说,Processing 引用没有错,因为它不是在谈论 Arduino。
猜你喜欢
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多