首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetMessageTime溢出是否像GetTickCount

GetMessageTime溢出是否像GetTickCount
EN

Stack Overflow用户
提问于 2018-07-10 14:57:52
回答 2查看 256关注 0票数 1

GetMessageTime (因此,KBDLLHOOKSTRUCT的时间成员也有相同的限制,即当值超过49.7天时,GetTickCount会将其重新分配到0吗?)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-11 09:25:10

GetMesssageTimeGetTickCount在达到可以由各自的返回值类型表示的最大值后,都会换到最小的值。返回类型存在不一致性,其中GetMessageTime返回LONG (signed int),GetTickCount返回DWORD (unsigned int)。

GetMessageTime的文档要求:

来自GetMessageTime函数的返回值不一定在后续消息之间增加,因为如果计时器计数超过长整数的最大值,则值.包装为长整数的最小值。

由于返回值的签名性,GetTickCount的文档描述了一种不同的包装模式:

经过的时间存储为DWORD值。因此,如果系统连续运行49.7天,的时间将变为零,。

因此,两个返回值都在不同的时间点换到不同的值。GetMessageTime在达到‭2147483647‬(大约在24.9天后)后将包装为-2147483648,而当超过‭4294967295‬时,GetTickCount包装为0。在初始环绕之后,两个返回值以相同的频率环绕,其中时间点被移动了一个周期的一半时间周期。

这就是C语言的保证。由于这是视窗,我们可以限制自己的Win32 ABI的更强有力的保证,这需要两个补码算法。因此,GetMessageTimeGetTickCount的返回值的二进制表示是相同的。如果您决定将GetMessageTime的返回值转换为DWORD,您将观察到该值的包装与来自GetTickCount的相同。

我并不完全清楚为什么GetMessageTime会返回一个有符号的值。它的选择可能是为了让人们更容易地进行被认为是更常见的计算。不过,这是猜测。雷蒙德·陈的博客文章MSG.time和GetMessageTime使用什么时钟?有更多的信息,但没有回答“为什么”这个问题。

票数 3
EN

Stack Overflow用户

发布于 2018-07-10 15:12:22

是的,评论部分甚至这么说。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51268459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档