2014-02-24 110 views
0

我正在钻研C,因为我需要将ctypes库导入到python以允许键盘控制。我努力学习下面的代码是如何工作的:C - 签名和无符号整数

import ctypes 
import time 

SendInput = ctypes.windll.user32.SendInput 

# C struct redefinitions 
PUL = ctypes.POINTER(ctypes.c_ulong) 
class KeyBdInput(ctypes.Structure): 
    _fields_ = [("wVk", ctypes.c_ushort), 
       ("wScan", ctypes.c_ushort), 
       ("dwFlags", ctypes.c_ulong), 
       ("time", ctypes.c_ulong), 
       ("dwExtraInfo", PUL)] 

class HardwareInput(ctypes.Structure): 
    _fields_ = [("uMsg", ctypes.c_ulong), 
       ("wParamL", ctypes.c_short), 
       ("wParamH", ctypes.c_ushort)] 

class MouseInput(ctypes.Structure): 
    _fields_ = [("dx", ctypes.c_long), 
       ("dy", ctypes.c_long), 
       ("mouseData", ctypes.c_ulong), 
       ("dwFlags", ctypes.c_ulong), 
       ("time",ctypes.c_ulong), 
       ("dwExtraInfo", PUL)] 

class Input_I(ctypes.Union): 
    _fields_ = [("ki", KeyBdInput), 
       ("mi", MouseInput), 
       ("hi", HardwareInput)] 

class Input(ctypes.Structure): 
_fields_ = [("type", ctypes.c_ulong), 
      ("ii", Input_I)] 

# Actuals Functions 

def PressKey(hexKeyCode): 

    extra = ctypes.c_ulong(0) 
    ii_ = Input_I() 
    ii_.ki = KeyBdInput(hexKeyCode, 0x48, 0, 0, ctypes.pointer(extra)) 
    x = Input(ctypes.c_ulong(1), ii_) 
    SendInput(1, ctypes.pointer(x), ctypes.sizeof(x)) 

def ReleaseKey(hexKeyCode): 

    extra = ctypes.c_ulong(0) 
    ii_ = Input_I() 
    ii_.ki = KeyBdInput(hexKeyCode, 0x48, 0x0002, 0, ctypes.pointer(extra)) 
    x = Input(ctypes.c_ulong(1), ii_) 
    SendInput(1, ctypes.pointer(x), ctypes.sizeof(x)) 


def AltTab(): 
    ''' 
    Press Alt+Tab and hold Alt key for 2 seconds in order to see the overlay 
    ''' 

    PressKey(0x012) #Alt 
    PressKey(0x09) #Tab 
    ReleaseKey(0x09) #~Tab 

    time.sleep(2)  
    ReleaseKey(0x012) #~Alt 


if __name__ =="__main__": 

    AltTab() 

我不理解有关符号和无符号整数部分:

INT射程为-32768 - 32767

unsigned int的取值范围为0 - 65535

我读到:“由于您有16位可以表示数字,所以可以用2字节数显示的数字的总范围是2^16^2^16与65536相同,因为我们从0开始计数,与0 - 65535相同。这显然与一个unsigned int值相匹配,所以你可以看到,这是多么这种类型的操作“

这似乎是有道理的,但有一件事我不明白:

1字节= 8位 2个字节= 16位

那么为什么2字节数被称为2^16而不是2^8?

+1

,因为它有16位。每个位可以容纳2个值,因此2^16个可能的数字与2个字节 – pippin1289

+0

啊当然,谢谢。 – Phoenix

+0

注意:根据C,[byte](http://en.wikipedia.org/wiki/Byte#Common_uses)至少为8位。 – chux

回答

1

我不理解有关符号和无符号整数部分:
INT射程为-32768 - 32767
unsigned int类型的范围为0 - 65535

FYI :int的尺寸(以及它可以容纳的值)实际上可以取决于您的环境。知道整型变量类型(至少从C99开始)的大小(位宽)的确切方法是使用stdint.h中定义的类型之一,在那里可以找到显式类型,如int8_tint16_t。通常不需要,但只是一个有趣的事实,一个学习C.

无论如何,在你的问题。所以“为什么2字节数字被称为2^16而不是2^8”

16是用于位数。在2个字节中有16位。

2是每个位的可能性数量。(0或1)

所以2个字节可以表示2^16个号码从0000000000000000 到1111111111111111

+0

“stdint.h”不不会告诉你任何关于int的大小。你想'limits.h'(并且在很多情况下你想使用'stdint.h'中的类型---也许在某些嵌入式软件中,但除此之外?) –

+0

@James请详细说明。 'limits.h'为你提供了定义类型中最大值和最小值的宏(比如'INT_MIN'和'INT_MAX')。然而,精确的宽度(位数)整数类型在'stdint.h'中定义;如'int8_t'确保8位有符号类型。我指出'int'不能保证在每个平台上都是一个特定的宽度,为了得到一个保证宽度,必须使用'stdint.h'中的类型。你是说这个信息不正确? – Mike

+0

你说'stdint.h'是一种知道变量类型大小的方法(例如'int')。这是错误的。而且你通常不想在日常代码中使用'stdint.h'中的类型;关于您使用它们的唯一情况是,当与外部接口连接时,即使这样,通常也只能在供应商也提供很多其他保证的嵌入式软件中进行接口。 –

1

一个2字节的数字有16位(2 x 8位)。告诉您可由给定位数表示的最高无符号数的函数为2^n-1,因此例如8位可表示数字0至255,16位0至65,535等。

此原因很简单。考虑不能用表示的第一个数字(比如说)是16位。这将是1 16个零,因为这是17位数字的最小二进制数。那是2^16。所以可以用这种方式表示的最大数字是2^16-1

另请注意,C中的int的大小将取决于您的C编译器。它可能不总是2个字节长。

1

2字节数包含16位。它们中的每一个都可以保存2个值,因此它可以生成2^16个可能的数字,这是您可以编码的不同信息的数量。