在使用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
感谢您的支持!
不是 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的类型作为参数,如果适用,整数提升将在左值到右值转换后自动应用。这种转换总是保留值。
谢谢你的回答。我想我现在明白了问题背后的原因!