avr 中的一元运算符:未定义的行为?

jkb*_*337 0 c avr unary-operator avr-gcc 8-bit

我遇到的问题是

voltage = voltage*2/3; voltage *= 2/3;

给出了不同的结果。该变量正在 uint16_t8 位 AVR 微控制器上运行。 第一个语句给出了正确的结果,第二个语句始终返回 0

我的一些朋友告诉我,一般不应该使用一元运算符,这让我思考,因为我也使用诸如 PORTC &= ~(1 << csBit);. 对于编译,我使用 avr-gcc(如果这可以给您一个想法)。

在此先感谢您的帮助

编辑#1:

好的,我明白 = 不是一元运算符。根本区别还在于 '''=''' 从右侧开始,而 ''''*, /''' 从左侧开始。

我想对于uints,这两种说法都不正确,我必须写电压=(uint16_t)((float)电压*(float)2/3)

并感谢@Lundin 指出如何正确回应回复

Eri*_*hil 6

voltage = voltage*2/3乘以voltage2,除以 3,并将结果存储在 中voltage

voltage *= 2/3将 2 除以 3,将结果乘以voltage并将结果存储在 中voltage。整数除法会截断,因此2/3产生零。

这些都不是一元运算符。