« 上一篇下一篇 »

论单片机编程中数据类型的应用

刚刚在《C专家编程》一书中看到这么一段话:

尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄,国债)而用它来表示数量。

尽量使用int那样的有符号类型,这样在涉及类型转换时,不必边界问题。

只有在使用bit-field和二进制掩码时,才使用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者无符号数,这样不必由编译器来选择结果的类型。

尤其是“尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。”这一句,让我顿时有点不解,因为之前在MCU的程序中,我定义类型一般都是用无符号类型的,一下子也记不起来以前为什么都是这样做了,而这里却说不要使用无符号类型,难道我以前都搞错了?

在网上查了下资料,事实上,对于MCU的编程,我们用到的数据一般都是正整数,没有涉及到负数,自然没必要去用有符号的类型,而且,有符号的类型,数据的取值范围比无符号类型要小一半,比如一个数200,如果用有符号类型,则我们至少要使用2字节的int short类型,而如果用无符号型,则使用unsigned char即可,这样便可以节省一个字节,一个变量节省一个字节,对于RAM和FLASH空间都比较有限的MCU来说,这就显得尤为重要了。另一方面是,MCU的程序中,我们常常会用到移位运算、位运算等,而对于这些运算来说,使用无符号类型是最方便也是最安全的,因为我们经常会有些像SPI通讯或者是串口通讯之类的操作,而这些通讯我们一般会配置会8位的数据帧格式,如果你定义了一个8位的变量,那么移到最高位时,相应的位就变成符号位了,这样自然就不正确了。而且,很多MCU单纯从汇编层运算上没有负数概念,引入负数在一些运算上只会增加编译后的指令条数,使得运算速度变慢。所以,能用整数就不要用浮点数,不用负数就定义成无符号数,才能提高运行速度。

当然,需要用到负数的地方,那我们还是得定义成有符号类型,该用还是得用,只是说如果不需要用到负数,则定义为无符号类型即可。

所以说,“尽信书不如无书”这句话真的很对,看书要批判的看,实际上上面那段话也不能说是错的,只是它不适用在单片机编程中而已。


——2019.09.01 21:12   于广州花都