C - целое число со знаком и без знака

0

Я вникаю в 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?

  • 1
    потому что он имеет 16 бит. каждый бит может содержать 2 значения, таким образом 2 ^ 16 возможных чисел с 2 байтами
  • 0
    Ах, конечно, спасибо.
Показать ещё 2 комментария
Теги:
ctypes
unsigned-integer

3 ответа

1
Лучший ответ

Часть, которую я не понимаю, связана с целыми целыми и беззнаковыми целями:
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

  • 0
    stdint.h ничего не говорит вам о размере int . Вы хотите limits.h (и очень, очень мало случаев, когда вы хотите использовать типы в stdint.h - может быть, в каком-то встроенном программном обеспечении, но в противном случае?)
  • 0
    @ Джеймс Пожалуйста, опишите подробно. limits.h дает вам макросы, которые определяют максимальные и минимальные значения в типе (например, INT_MIN и INT_MAX ). Точная ширина (число битов) целочисленных типов, однако, определена в stdint.h ; такой как int8_t который гарантирует 8-битный тип со int8_t . Я говорил, что int не обязательно должен быть определенной шириной на каждой платформе, чтобы получить гарантированную ширину, нужно использовать типы в stdint.h . Вы говорите, что эта информация неверна?
Показать ещё 2 комментария
1

2-байтовое число содержит 16 бит. Каждый из них может содержать 2 значения, поэтому он может генерировать 2 ^ 16 возможных номеров, и это число различной информации, которую вы можете кодировать.

1

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 байта.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню