GetAsyncKeyState's return values don't seem to correspond with the description
在代码示例中看到GetAsyncKeyState之后,我研究了它如何通过WASD键在屏幕上移动虚构字符。
我在其MSDN页面上阅读了此内容:
Return value
Type: SHORT
If the function succeeds, the return value specifies whether the key
was pressed since the last call to GetAsyncKeyState, and whether the
key is currently up or down.
If the most significant bit is set, the
key is down, and if the least significant bit is set, the key was
pressed after the previous call to GetAsyncKeyState.
我无法理解返回值的结构:
它说类型是short,所以我想通过它可以将数字零表示为二进制,0000000000000000或十六进制0x0000(因为据我所知,一个十六进制数字表示四个二进制数字)。
说明说,按下键时应设置最高有效位。这使我认为,如果设置了所说的位,则该数字将如下所示:
为了更好地在程序中使用它,我通过将其转换为十六进制来缩短了它,从而使其成为:
因为十六进制中的8应对应于二进制文件中的1000。
当我看到上述机制在我的程序中不起作用(无论是否按下键时,执行GetAsyncKeyState(chr) == 0x8000总是会产生false),我又看了一下原始示例,我看到了在第一的。在那里,将返回值与数字-32767进行比较,当使用Windows计算器将其快速转换为十六进制时,结果为值0xFFFFFFFFFFFF8001。现在,不要介意最后一个十六进制数字(1),因为这是用于检查最低有效位是否也处于活动状态的位,但是我不希望这样。
在这里我不明白的事情如下:
为什么如果一个十六进制数字表示四个二进制数字,并且函数的输出值是短数字(两个字节),那么在此用十六进制数字表示数字呢?那八个字节不是吗?
返回值的描述说,如果按下该键,最高有效位将被设置为1,这使我相信该数字看起来像1000000000000000,而不是0000000000001000。我在这里想念什么?
1
| GetAsyncKeyState(chr) == 0x8000 |
这是不正确的检查。用途:
1
| !!(GetAsyncKeyState(chr) & 0x8000) |
查看是否设置了最高有效位。
值0xFFFFFFFFFFFF8001与GetAsyncKeyState的实际返回值不对应。 Windows计算器不知道从GetAsyncKeyState返回的值的大小,因此它假定您使用的是64位数字。您可以在其设置中覆盖它。
-
什么!在表达之前呢?
-
@GabrieleCirulli:它是将其转换为bool的最短方法。在这种情况下等效于:(GetAsyncKeyState(chr) & 0x8000) != 0
-
由于返回值很短,因此返回值将被扩展,因此0xFFFFFFFFFFFF8001是正确的64位表示形式。
1-返回值是SHORT,它是16位= 2字节。
2-最高有效位是第15位,因为如果将该值强制转换为32位INT,则该值将被签名,因此16位1000 0000的值将变为1111 1111 1000 0000(在64位世界中,转换将是1000 0000-> 1111 1111 1111 1111 - 1111 1111 1000 0000)。如果只想测试有符号整数值的最高有效位,则将其与零进行比较:
1 2 3 4
| if(GetAsyncKeyState(...) < 0)
{
// Hey, MSB is set here!
} |
- 您能否向我解释将其与0比较会导致检查最高有效位的逻辑原因?
-
因为带符号的负整数始终设置最高有效位,而带正数则取消设置。零具有所有等于零的位。比较零是测试MSB的明智方法。