提问者:小点点

Arduino:在 Serial.print() 中处理int8_t变量


在使用Arduino时,我一直在寻找以下行为的答案。但是什么也没找到,所以希望你能支持。

我定义了两个int8_t变量 vA 和 vB。vA 定义为例如 125,vB 定义为 31。如果我首先添加它们并分配给int8_t变量 vSum,然后调用 Serial.println(vSum),数字 -100 将按预期打印(因为它们溢出为 8 位数字)。

现在,当我调用Serial.println(vA vB)时,结果是错误的(156)。据我了解,在这种情况下,Serial.println() 会将总和的结果转换为有符号的 int。不过,我本以为它仍然返回正确答案。

我的理解显然是错误的。有人知道它为什么会这样吗?

这里再次显示代码

int8_t vA =125;
int8_t vB =31;
int8_t temp;
temp = vA+vB;
Serial.println(temp);  // This works as expected
Serial.println(vA+vB); // this does not work

感谢您的支持!


共2个答案

匿名用户

不是 Serial.println 强制转换值。这是算术运算。

< code>vA vB的返回值已经是一个有符号整数。

在一种情况下,您将其存储在一个int8_t变量中,结果是-100

在另一种情况下,您打印该操作实际产生的< code>156。

您必须将(vA-vB)转换为int_8才能打印-100

Serial.println(int_8(vA+vB));

阅读以下内容: https://en.cppreference.com/w/cpp/language/operator_arithmetic

如果传递给算术运算符的操作数是整数或非整数枚举类型,则在任何其他操作之前(但在左值到右值的转换之后,如果适用),操作数经历整数提升。

还有这个:

https://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion

小整型(如char)的pr值可以转换为大整型(如int)的pr值。特别是,算术运算符不接受小于int的类型作为参数,如果适用,整数提升将在左值到右值转换后自动应用。这种转换总是保留值。

匿名用户

谢谢你的回答。我想我现在明白了问题背后的原因!