2014-02-24 70 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個可能的數字,這是您可以編碼的不同信息的數量。