我遇到了一个令人沮丧的问题,无法弄清楚原因。 我正在使用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,但无济于事。
我想念的是什么(显而易见的?)?