嵌入式C语言里的土豪们之变量类型本文引用地址:http://www.eepw.com.cn/article/184332.htm
上一篇我们谈到了运算奢华大户除法(详见《嵌入式C语言里的土豪们之除法与移位》http://www.eepw.com.cn/article/182359.htm),这们再来研究一下内存的消耗土豪——变量类型的定义。
“定义变量的类型要根据该变量使用的大小范围来定,在满足其最大值的条件下,使用最小空间的变量类型。”这条定义方式我们初学嵌入式编程的人们都会遇到,那么这个如何去执行也成为了关键。例如,我们在定义时钟项目时,使用一个变量来代表“秒”的变量,显然,这个“秒”变量的最大值是60。那么,我们就可以使用“char”类型来定义他了。很简单,“0-59”的变量范围,最小的范围为128范围内的char,而int类型要达到了32726,看吧!还是char类型更小、更节省类型。可是,其背后的真的有这么简单吗?跟着笔者一起来探讨吧!
这个想法的初衷肯定是为了节省内存,当然,笔者首先同意这种以最大值来考虑定义变量范围,并选择是有符号类型,还是无符号类型。然而,针对我们嵌入式C语言编译器来说,还是使用可移植的固定长度变量定义方式来定义我们所有的变量。
当我们看到“char seconds;”这一句的时候,其实很难理解原作者的意思。因为我们不知道原作者使用“char”类型是仅仅为了其数值表示范围已经符合了变量定义要求,还是出于其它目的?异或是,原作者已经深知编译器默认会将“char”类型转换为“unsigned char”?“short long”的变量类型也会如此之“麻烦”。因此一个“short”变量类型可以是16位,也可以是32位,这个完全取决于编译器与我们目标处理器的位宽——这个原作者应该已经知道,当然,也许被忽略了。
“无论何时都要使用C99格式的可移植固定变量定义类型来定义变量的长度。”
Uint16_t这种类型定义方式,我想,你绝对不会理解错的我用意,即使我已经沉睡百年……这种类型定义的方式不仅新添了变量而且同时也更好的注释了定义类型,极大的增加了源代码的可读性。C99标准已经为大家预定义了各种固定长度的变量,也是时候将“short”“long”等类型从我们的源文件里剔除的时候了,甚至在我们在应用中就使用ASCII码来表示的字符也不要使用“char”类型。任何事情也不要绝对化,如果我们仅仅在某个循环中使用了“int I ”也是无所谓的。
这里笔者提示一下大家,如果不想自己去编译测试各个变量的类型宽度,也可以使用“stdint.h”的头文件,C99编译器已经为大家准备好了。如果只想使用多少位,也可以使用uint_leastN_t 与uint_fastN_t来定义。
运算与内存我们都研究完了,大家想动手写代码吗?