Я вникаю в 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) #~Alt
if __name__ =="__main__":
AltTab()
Часть, которую я не понимаю, связана с целыми целыми и беззнаковыми целями:
int имеет диапазон -32768 - 32767
unsigned int имеет диапазон 0 - 65535
Я читал: "Полный диапазон чисел, который может отображаться 2-байтным числом, равен 2 ^ 16, так как у вас есть 16 бит, которые могут представлять число. 2 ^ 16 - это то же самое, что и 65536, которое, поскольку мы подсчитываем от 0, совпадает с 0 - 65535. Это, очевидно, совпадает со значениями для unsigned int, поэтому вы можете видеть, что так работает этот тип. "
Кажется, это имеет смысл, но я ничего не понимаю:
1 байт = 8 бит 2 байта = 16 бит
так почему 2-байтовое число называется 2 ^ 16, а не 2 ^ 8?
Часть, которую я не понимаю, связана с целыми целыми и беззнаковыми целями:
int имеет диапазон -32768 - 32767
unsigned int имеет диапазон 0 - 65535
FYI: размер int
(и, следовательно, значения, которые он может удерживать) может фактически зависеть от вашей среды. Разумный способ узнать размер (битовую ширину) целочисленного типа переменной (по крайней мере, с C99) заключается в использовании одного из типов, определенных в stdint.h
, там вы найдете явные типы, такие как int8_t
и int16_t
. Обычно не требуется, но просто забавный факт для обучения C.
В любом случае, на ваш вопрос. Итак, "почему 2-байтовое число, называемое 2 ^ 16, а не 2 ^ 8",
16 - для количества бит. В 2 байтах 16 бит.
2 - для количества возможностей для каждого бита. (0 или 1)
Таким образом, 2 байта могут представлять 2 ^ 16- й номер от 0000000000000000 2 до 1111111111111111 2
stdint.h
ничего не говорит вам о размере int
. Вы хотите limits.h
(и очень, очень мало случаев, когда вы хотите использовать типы в stdint.h
- может быть, в каком-то встроенном программном обеспечении, но в противном случае?)
limits.h
дает вам макросы, которые определяют максимальные и минимальные значения в типе (например, INT_MIN
и INT_MAX
). Точная ширина (число битов) целочисленных типов, однако, определена в stdint.h
; такой как int8_t
который гарантирует 8-битный тип со int8_t
. Я говорил, что int
не обязательно должен быть определенной шириной на каждой платформе, чтобы получить гарантированную ширину, нужно использовать типы в stdint.h
. Вы говорите, что эта информация неверна?
2-байтовое число содержит 16 бит. Каждый из них может содержать 2 значения, поэтому он может генерировать 2 ^ 16 возможных номеров, и это число различной информации, которую вы можете кодировать.
2 байта имеет 16 бит (2 x 8 бит). Функция, которая сообщает вам самое высокое неподписанное число, которое может быть представлено заданным числом бит, равно 2^n-1
, поэтому, например, 8 бит могут представлять числа от 0 до 255, 16 бит от 0 до 65535 и т.д.
Причина этого проста. Рассмотрим первое число, которое не может быть представлено (скажем) 16 бит. Это будет 1 с 16 нулями, так как это наименьшее двоичное число с 17 цифрами. Это 2^16
. Таким образом, наибольшее число, которое может быть представлено таким образом, составляет 2^16-1
.
Также обратите внимание, что размер int
в C будет зависеть от вашего компилятора C. Это может быть не всегда 2 байта.