14.VC(custom)-原码、补码、反码、INFINITE解释和怎么WaitForSingleObject超时大于0x7FFFFFFF

原码:原码表示法在数值前面 增加了一位符号位(即最高位为符号位),该位为0表示正数,该位为1表示负数,其余位表示数值的绝对值大小。

反码:  正数的反码与其原码相同,负数的反码是对其原码逐位取反,但符号位除外。

补码:  正数的补码与其原码相同,负数的补码是在其反码的末位加1。

例如,我们用8位二进制表示一个数,+11的原码反码补码都为00001011,-11的原码就是10001011,反码是11110100,补码是11110101。

计算机中负数只能用补码表示:

如8位二进制:

原码:-127到127

反码: -127到127

补码: -128到127

也就是只有补码能表示-128,因为-127的原码为11111111,反码为10000000,所以-128无法用原码或反码表示,-127的补码是10000001,减1变成-128,也即10000000.

注意10000000是-128,而不是-0,

因为0可以用0000000表示,-0原码是10000000,反码是11111111,补码是反码加1为00000000和0一致.


INFINITE在MSDN中有如下解释:

此常数的值是 -1。对于接受 timeout 参数的线程处理方法(如 Thread.Sleep(Int32) Thread.Join(Int32)),该值用于取消超时行为。

也就是它用来取消超时设置的,go to definition 看到的值是0xffffffff(不要理解成49.75天,它就是-1的补码,32个1)。

WaitForSingleObject中msdn有解释,说Any time-out value between 0x7FFFFFFF and 0xFFFFFFFF — that is, values from 0x80000000 through 0xFFFFFFFE — is equivalent to 0x7FFFFFFF,也就是要么是无限等待,要么最大值为0x7FFFFFFF,那要是等待100天呢,解决方法,可以用获取系统时间的方法相结合,每一小时检查一次,

随手贴的代码:

  CTime tmStart = CTime::GetCurrentTime();
		   CTimeSpan tmHundred(100,0,0,0);//100天
	       CTime tmEnd = tmStart + tmHundred;
		   while(1)
		   {
			   CTime tmNow = CTime::GetCurrentTime();
			   CTimeSpan tmSpan = tmEnd - tmNow;
			   CTimeSpan tmTwoHour(0,2,0,0);//2小时 
			   CTimeSpan tmOneHour(0,1,0,0);//1小时
                // HANDLE hEvent ;
			   if( tmSpan <  tmTwoHour)
			   {
				   WaitForSingleObject(hEvent,tmSpan.GetTotalSeconds()*1000);
				   break;
			   }
			   else
			   {
				  WaitForSingleObject(hEvent, tmOneHour.GetTotalSeconds()*1000);
			   }
		   } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值