繁体   English   中英

C-有符号和无符号整数

[英]C - Signed and Unsigned integer

我正在研究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?

一个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个字节长。

我不了解的部分与有符号和无符号整数有关:
int的范围是-32768-32767
unsigned int的范围是0-65535

仅供参考:一个int的大小(以及它可以容纳的值)实际上取决于您的环境。 知道整数变量类型(至少从C99开始)的大小(位宽)的肯定方法是使用stdint.h定义的类型之一,您将在其中找到诸如int8_tint16_t类的显式类型。 通常不需要,但是对于一个学习C的人来说只是一个有趣的事实。

无论如何,关于您的问题。 因此,“为什么2字节数字称为2 ^ 16而不是2 ^ 8”

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

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

所以2个字节可以代表20000 从0000000000000000 2到1111111111111111 2的数字

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM