TInt64是symbian中的长整型量。在需要较大的数字的时候,我们往往需要使用这个类型的变量。但是TInt64有一个特点,或者说是编译器有一个特点,就是不能直接使用连乘的方式给TInt64的变量赋值。
在前一个项目中,我使用TInt64的变量作周期来控制频率。具体做法是比较2个TTime 变量,如果时间的差大于周期,那么开始下一次的动作。开始的时候我是这样做的:
TInt64 cycle = 24 * 3600 * 1000000;
原本cycle变量对应的是24小时。但是最后的结果是:动作每隔不到十分钟就会发生。经过逐步排查之后,把错误定位到cycle上面了。不看不知道,一看吓一跳啊。
cycle = 500654080;
比预想的86400000000小很多。为什么会出现这种结果呢?最后发现是编译器的问题,在进行连乘的时候,编译器按照TInt32的方式存取数据,最后将结果赋值给TInt64变量。这样,如果在连乘的过程中,出现了溢出的问题,那么最后的结果就会是错误的。
怎么办呢,可以使用2种方式:
1、 TInt64 a = 24 * 3600;
a *= 1000000;
2、 TInt64 a1 = 24 * 3600;
TInt64 a2 = 1000000;
TInt64 a = a1 * a2;
其实这2个方法本质上是一样的,都是为了避免溢出的问题。这里的溢出问题是通过连乘之后将结果赋值给TInt64的变量所产生的。希望大家从我这里吸取了这个教训。