C语言中!和~的区别

在C语言中

!表示数值取反

~ 表示按位取反

今天在驱动舵机时,写了个判断,当i=100时,方向dir取反。

这里dir定义的是uint8_t,初值为1;i定义的是uint16_t;初值为499;因为是舵机,控制定时器的CCR1在499~2499之间,以使舵机在这个范围内正反转。为啥不用uint8_t,因为数值大于256,uint16_t可以到65535;一般不用int,因为数值太大。

这里可以说一下为啥用uint8_t

在不同的单片机中,有位数的区别,比如8位,16位,32位,他们位数的不同会导致在编译int型数据的时候有区别,8位和16位在编译的时候有可能会编译成2个字节,也就是16位,所以为了统一,就使用uint32重新定义,uint后的数字就代表位数。32位的数据就是4个字节。

改变方向时我使用了

~dir

结果舵机一到180°就跑飞,猛转。

我反复检查代码,好像也没有哪里有问题

我按照朴素的判断写法,它又没问题了,最终我把问题定位在了~dir中

当我换一种写法,!dir时,它就好了。

我寻思这两个不是一样的吗?

都是取反的意思,一个按位取反,一个以数值为基准取反。

按位取反基于你的数据的类型,不论是8位,16位还是32位,在单片机看来都是二进制的数据。它会将这个数据以二进制的形式进行取反。

也就是说我定义的dir = 1;在单片机看来就是0001,取反之后就是1110;所以出现了错误。

而!是按数值进行取反,所有非零的都变成0,0变成非零

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值