【发布时间】:2021-12-09 09:55:17
【问题描述】:
我的问题是
voltage = voltage*2/3;
和
voltage *= 2/3;
给出了不同的结果。变量为 uint16_t,在 8 位 AVR 微控制器上运行
第一个语句给出了正确的结果,第二个语句总是返回 0。
我的一些朋友告诉我,一般不应该使用一元运算符,这让我想到,因为我也使用像 PORTC &= ~(1 << csBit); 这样的东西。对于编译,我使用 avr-gcc 如果这可能会给你一个想法。
提前感谢您的帮助
编辑#1:
好的,我知道 = 不是一元运算符。另外根本的区别是'''='''是从右边开始的,而''''*, /'''是从左边开始的。
我猜对于 uint,两个语句都不正确,我必须写电压 = (uint16_t)((float)voltage*(float)2/3)
感谢@Lundin 指出如何正确回复回复
【问题讨论】:
-
voltage *= 2/3;等价于voltage = voltage * (2/3)。*=不是一元运算符,它是属于 复合赋值 运算符组的二元运算符。 -
顺便说一句,
1 << ...几乎总是 8 位和 16 位微控制器上的错误,因为您最终可能会将数据转移到由1创建的int类型的符号位中。永远不要对有符号操作数进行按位运算,将1替换为1u。 -
*=或+=等赋值运算符的术语是复合赋值,与直接赋值 运算符=相对。
标签: c avr avr-gcc unary-operator 8-bit