使用WIN32 被API参数类型坑到的记录

最近在做项目,有个需求是测硬盘剩余空间,并进行预测的。
通常情况下是用GetDiskFreeSpaceEx这个API。
但是问题来了,在测试过程中,我模拟了一个硬盘大小是100MB,然后添加了一个200MB的文件,按照道理应该会提示空间不足。奇怪的事情发生了,这一步被跳过了…
思考了一会,我一度以为是我设计出了问题,排查着问题,突然我想起了以前看过了一个开源对size_t的处理方法以及作者对这段处理的解释。我知道问题所在了,size_t跟DWORD都是无符号类型,我在业务逻辑是这样处理的

DWORD free=xxx;
for(...)
{
	free-=use[];
	if(free<0)
	{
		Tip;
		return;
	}
}

咋一看逻辑上莫得问题,但是DWORD是个无符号类型,那么问题就来了,无符号类型会得到小于0的结果吗?答案必然是不会。以下是一段测试代码,如果大家无法理解可以自己去编译运行下以下的代码

    DWORD a = 10;
    DWORD b = 11;
    if (a - b > 0)
    {
        std::cout << "测试1 a>b?";
    }
    else
        std::cout << "测试2 a<b?";

运行结果是测试1 a>b为什么呢?其实主要是因为DWORD,本质看a<b,所以可能第一感觉就是a-b<0但是由于a,b所属类型为无符号类型,所以得出结果是-1的补码4294967295,对于这种问题,解决方案需要进行变化

 	DWORD free=xxx;
    for(...)
    {
    	if(free>=use[])
    	{
    		free-=use[];
    	}
    	else
    	{
    		tip;
    		return;
    	}
    }

处理方式就是这么简单!得不出<0但是可以先对比啊!对比完了如果剩余空间比需要占用的空间大那么就预留空间进行下一个空间预留计算,如果空间不足,那就提示,不得不说那段代码给了我排bug提供了一个很大帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值