C++ Arduino上的负整数比较
我遇到了一个令人沮丧的问题,找不出原因。 我在用C++来研究一个ARUDIO(UNO),并试图找出一个整数是否定的还是正的。但是:C++ Arduino上的负整数比较,c++,arduino,integer,C++,Arduino,Integer,我遇到了一个令人沮丧的问题,找不出原因。 我在用C++来研究一个ARUDIO(UNO),并试图找出一个整数是否定的还是正的。但是: const int32_t remaining = (int32_t)item->delay.delay - chrono; serialPrintlnf("remaining=%d", remaining); serialPrintlnf("remaining>0=%d", remaining > 0); serialPrintlnf("rema
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));
在中,我们注意到max实际上是在Arduino.h#93中实现的
因此,它也失败了也就不足为奇了。
我注意到保留为-1的硬编码可以工作,但我希望是编译器启动并完全删除比较
尝试Serial.println(剩余,BIN)时会出现一些奇怪的情况
,它给出了-1841
的100111111100011001111
,这与16位或32位2补码表示不对应
当剩余值实际上为正值时,结果是相同的。IDE声称使用的比较运算符是
运算符我猜int
小于32位,因此%d
不是显示int32\t
的正确格式。这有什么奇怪的?关于max
宏,它失败并不奇怪?为了澄清我上面的评论,我相信为了证实@interjay的猜测,Arduino上的int
是16位的。使用%ld
并转换为long
。std::cout通过设计知道正确的类型!
remaining=-1565
remaining>0=1
remaining<0=0
max(remaining, 0)=-1565
#define max(a,b) ((a)>(b)?(a):(b))