Arduino上的负整数比较

时间:2017-10-15 14:56:28

标签: c++ arduino integer

我遇到了一个令人沮丧的问题,无法弄清楚原因。 我正在使用C ++编写一个Arudino(UNO)并尝试查找整数是负数还是正数,就是这样。但是:

const int32_t remaining = (int32_t)item->delay.delay - chrono;
serialPrintlnf("remaining=%d", remaining);
serialPrintlnf("remaining>0=%d", remaining > 0);
serialPrintlnf("remaining<0=%d", remaining < 0);
serialPrintlnf("max(remaining, 0)=%d", max(remaining, 0));

(chrono是该类的int32_t成员),结果为:

remaining=-1565
remaining>0=1
remaining<0=0
max(remaining, 0)=-1565

注意到max实际上是在Arduino.h#93中实现的

#define max(a,b) ((a)>(b)?(a):(b))

所以它也失败也就不足为奇了。 我注意到硬编码保持为-1会起作用,但我希望编译器可以完成并完全删除比较。

在尝试Serial.println(remaining, BIN);时出现奇怪的事情,它为100111111100011001111提供-1841,这与16位和32位2补码表示不对应。

当剩余实际为正时,结果相同。 IDE声称使用的比较是operator <(long, long),这似乎是正确的(Visual Studio 2017,虽然可能会因为代码是为Arduino而不是我的处理器编译而混淆)。我试图将0更改为0L,将其转换为int32_t,将其替换为-1,调用Beelzebub,但无济于事。

我想念的是什么(显而易见的?)?

0 个答案:

没有答案