持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
今天在开发程序过程中遇到了这样一个问题,我简直不敢相信我的眼睛!
DWORD类型数据与int类型数据进行比较时,判断条件居然每次都成立,简直是匪夷所思了!
我的代码是这样的:
DWORD dwStartTime/*GetTickCount()数值*/;
DWORD dwEndTime/*GetTickCount()数值*/;
if(fabs(dwStartTime - dwEndTime) > 500)
{
//属于有效数据
}
就是上面这短短的代码,乍眼一看,怎么会出错误呢?其实,这里面的问题确实很大!
思路1
我以为是dwStartTime - dwEndTime计算的值有问题,就进行日志输出。
首先,我将两个数据的差值直接输出了,输出方式:
qDebug() << dwStartTime - dwEndTime;
输出的内容居然是一个很大的值,由此,我就怀疑是不是有一个数值是不是真的特别大?
后来,我就对两个数据分别进行输出,发现,目测差值也不会大于500。
那是什么原因导致每次都进入if循环呢?
思路2
是不是因为采用fabs的原因?
为了验证我的想法,重新修改了下函数
if((dwStartTime - dwEndTime > 500) || (dwEndTime - dwStartTime > 500))
{
//属于有效数据
}
运行程序发现,与使用fabs的效果一致,说明与fabs函数无关。
那就剩下一种可能了,DWORD类型与int比较时出问题了。
思路3
为了验证该想法,将DWORD计算的差值转成int类型,代码如下:
int n = (int)(dwStartTime - dwEntTime);
if(fabs(n) >500)
{
//属于有效数据
}
运行程序后发现,果真是这样的,DWORD类型数据与int类型数据在做比较时,确实有问题。
其实,到这里也并不算真正的将问题解决好。
DWORD代表的是unsigned long类型,只有正数没有负数;
int代表的是整型,可以是负数也可以是正数
因为在程序运行时,并不清楚两个DWORD类型哪个大时,就会出现我今天遇到的问题。
主要核心是这里:
当一个数值大的DWORD类型 - 数值小的DWORD类型,差值是一个特别大的值。
由此可以得出,在与其他值进行比较时,首先需要判断DWORD值是否有效,再进行后续操作!
我是中国好公民st,一名C++开发程序猿~