三 变量定义
写代码,变量是我们操作的基本元素。
那么有几个问题,不知道大家想过没有。变量在哪里赋值,使用有符号的还是无符号的,使用几个字节类型,变量怎么取名。
一般的教材或文章都会建议大家变量声明后要立刻初始化。那么初始化的值写成什么呢?0,或者是赋个参数?
我一般会尽量在声明的时候就一次性赋个正确的值,而不会先赋个初值,然后在用到该变量的时候再重新赋正确的值。
但很多时候,要到用到的时候才能赋正确的值,这个时候就先赋初值。
变量的类型呢,怎么选?
我的考虑因素:
尽量用整型,基本不用浮点型;整型运算速度更快,遇到小数运算时,我也尽量用整型运算来近似。
我用的最多的,是INT8, UINT8, INT32这三种类型,基本不用UINT32,或者16位类型。选择32位类型,因为在计算机中有符号32位类型是基本的处理类型(这个可能需要查一下书,我印象中有书是这样讲的)。另外,只要涉及算术运算,其结果也往往是INT32类型,所以一般选32位有符号类型。
我用8位类型多的原因是我开发了大量的图像处理程序,而像素值RGB、YUV,通常用8位无符号数表示。需要说的一点是,凡是保存在内存中的大量数据,应该尽量选择使用紧凑短小的数据类型,这样减少内存访问量,有利提高速度。比如我在处理二值图像的时候,就使用一个比特表示一个像素点,这样一个字节就表示8个点,从而有效减少了数据量。
关于数据类型的选择,建议看看《深入理解计算机系统》这本书。
变量怎么取名呢?
我经常用的名字:s32FrmWidth,stParam…
在嵌入式领域,特别在需要做大量数据处理的情况下,我还是认为匈牙利命名法是有优势的。虽然在其他领域中有其问题而不受青睐甚至被抛弃,但在有些领域内,实践证明这是一种好的方法。特别是在数据类型适配,算术运算时,通过看前缀,就能避免很多错误。
例如,s32Width >> 1,当看到前缀s32的时候,就知道这是一个有符号32位类型数据,有符号类型右移是算术右移,这样我会立刻去检查算术右移是否会带来副作用。另外在大量的赋值过程中,通过看前缀,就知道是否需要做强制类型转换。