Я углубляюсь в C, потому что мне нужно импортировать библиотеку ctypes в python, чтобы обеспечить управление с клавиатуры. Я пытаюсь узнать, как работает следующий код:
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) #~Altif __name__ =="__main__":
AltTab()
Часть, которую я не понимаю, относится к целым числам со знаком и без знака:
int имеет диапазон от -32768 до 32767
unsigned int имеет диапазон от 0 до 65535
Я читаю: «Общий диапазон чисел, который может отображаться с помощью 2-байтового числа, равен 2 ^ 16, поскольку у вас есть 16 битов, которые могут представлять число. 2 ^ 16 совпадает с 65536, что, поскольку мы считаем от 0, равно 0 — 65535. Это, очевидно, совпадает со значениями для беззнакового целого, поэтому вы можете видеть, что именно так работает этот тип. «
Кажется, это имеет смысл, но есть одна вещь, которую я не понимаю:
1 байт = 8 бит
2 байта = 16 бит
так почему 2-байтовое число называется 2 ^ 16, а не 2 ^ 8?
Часть, которую я не понимаю, относится к целым числам со знаком и без знака:
int имеет диапазон от -32768 до 32767
unsigned int имеет диапазон от 0 до 65535
К вашему сведению: размер int
(и, следовательно, значения, которые он может содержать) может фактически зависеть от вашей среды. Надежный способ узнать размер (битовую ширину) целочисленного типа переменной (по крайней мере, начиная с C99) — это использовать один из типов, определенных в stdint.h
там вы найдете явные типы, такие как int8_t
а также int16_t
, Обычно не требуется, но просто забавный факт для одного учащегося С.
Во всяком случае, на ваш вопрос. Итак, «почему 2-байтовое число называется 2 ^ 16, а не 2 ^ 8»
16 для количества бит. В 2 байтах 16 бит.
2 для количества возможностей для каждого бита. (0 или 1)
Таким образом, 2 байта могут представлять 2 ^ 16го номера от 00000000000000002 до 11111111111111112
2-байтовое число имеет 16 бит (2 х 8 бит). Функция, которая сообщает вам наибольшее число без знака, которое может быть представлено заданным количеством битов, 2^n-1
так, например, 8 битов могут представлять числа от 0 до 255, 16 битов от 0 до 65 535 и т. д.
Причина этого проста. Рассмотрим первое число, которое не могу быть представленными, скажем, 16 битами. Это будет 1 с 16 нулями, так как это наименьшее двоичное число с 17 цифрами. Это 2^16
, Таким образом, наибольшее число, которое может быть представлено таким образом, 2^16-1
,
Также обратите внимание, что размер int
в Си будет зависеть от вашего компилятора Си. Это не всегда может быть длиной 2 байта.
2-байтовое число содержит 16 бит. Каждое из них может содержать 2 значения, таким образом, оно может генерировать 2 ^ 16 возможных чисел, и это число различной информации, которую вы можете закодировать им.