Winapi GetMessageTime是否像GetTickCount一样溢出
一旦值超过49.7天,是否(以及的时间成员)也会受到重置回0的相同限制?是,备注部分甚至会这样说。是,备注部分甚至会这样说。在达到相应返回值类型所能表示的最大值后,这两个部分都会返回到最小值。返回类型不一致,其中Winapi GetMessageTime是否像GetTickCount一样溢出,winapi,Winapi,一旦值超过49.7天,是否(以及的时间成员)也会受到重置回0的相同限制?是,备注部分甚至会这样说。是,备注部分甚至会这样说。在达到相应返回值类型所能表示的最大值后,这两个部分都会返回到最小值。返回类型不一致,其中GetMessageTime返回LONG(signed int),而GetTickCount返回DWORD(unsigned int) GetMessageTime的文档调用: GetMessageTime函数的返回值在后续消息之间不一定增加,因为如果计时器计数超过长整数的最大值,则长整
GetMessageTime
返回LONG
(signed int
),而GetTickCount
返回DWORD
(unsigned int
)
GetMessageTime
的文档调用:
GetMessageTime函数的返回值在后续消息之间不一定增加,因为如果计时器计数超过长整数的最大值,则长整数的值[…]将换行为最小值
由于返回值的签名性,GetTickCount
的文档描述了一种不同的包装模式:
经过的时间存储为DWORD
值。因此,如果系统连续运行49.7天,时间将变为零
因此,两个返回值在不同的时间点包装为不同的值<代码>GetMessageTime到达后换行到-21474836482147483647 (大约在24.9天后),而当超过4294967295. 在初始环绕之后,两个返回值以相同的频率环绕,其中时间点移动了一个周期时间段的一半
这就是C语言的保证。由于这是Windows,我们可以限制自己使用Win32 ABI的更强大的保证,这需要两个补码算法。鉴于此,GetMessageTime
和GetTickCount
返回值的二进制表示形式是相同的。如果您决定将GetMessageTime
的返回值强制转换为DWORD
,您将看到与GetTickCount
相同的值包装
我不完全清楚,为什么GetMessageTime
返回一个有符号的值。选择它可能是为了更容易执行被认为是更常见的计算。不过,这只是猜测。Raymond Chen的博客文章提供了更多信息,但没有回答“为什么?”。这两个问题,以及在达到相应返回值类型可以表示的最大值后,返回到最小值。返回类型不一致,其中GetMessageTime
返回LONG
(signed int
),而GetTickCount
返回DWORD
(unsigned int
)
GetMessageTime
的文档调用:
GetMessageTime函数的返回值在后续消息之间不一定增加,因为如果计时器计数超过长整数的最大值,则长整数的值[…]将换行为最小值
由于返回值的签名性,GetTickCount
的文档描述了一种不同的包装模式:
经过的时间存储为DWORD
值。因此,如果系统连续运行49.7天,时间将变为零
因此,两个返回值在不同的时间点包装为不同的值<代码>GetMessageTime到达后换行到-21474836482147483647 (大约在24.9天后),而当超过4294967295. 在初始环绕之后,两个返回值以相同的频率环绕,其中时间点移动了一个周期时间段的一半
这就是C语言的保证。由于这是Windows,我们可以限制自己使用Win32 ABI的更强大的保证,这需要两个补码算法。鉴于此,GetMessageTime
和GetTickCount
返回值的二进制表示形式是相同的。如果您决定将GetMessageTime
的返回值强制转换为DWORD
,您将看到与GetTickCount
相同的值包装
我不完全清楚,为什么
GetMessageTime
返回一个有符号的值。选择它可能是为了更容易执行被认为是更常见的计算。不过,这只是猜测。Raymond Chen的博客文章提供了更多信息,但没有回答“为什么?”的问题。这种问题让我很难过。你链接到了MSDN文档,它直接回答了你提出的问题。@DavidHeffernan事实上,我觉得错过了这一部分就像个白痴一样,bleh抱歉!我从来没有想到过,但是文档和函数签名的某些地方看起来不太对劲GetMessageTime
返回一个LONG
(即signed int
),但GetTickCount
以及KBDLLHOOKSTRUCT
的时间成员useDWORD
s(即unsigned int
)。我一直认为,消息时间戳设置为GetTickCount
的结果,但鉴于上述情况,这是不可能的。有人知道这些API调用之间的关系吗?如果有的话?@IInspectable Documentation bug,请参阅。@Tirafesi+1感谢我愿意公开你的错误(以及有勇气将问题留在网站上)。你会走得很远的。这种问题让我很难过。你链接到了MSDN文档,它直接回答了你提出的问题。@DavidHeffernan的确,我觉得自己是个白痴,因为遗漏了这一部分