python和溢出字节?

Mel*_*oun 10 python variables overflow

我需要创建一个类似于C lanquage的变量.我需要范围为0-255的字节或无符号字符.这个变量应该溢出,这意味着......

myVar = 255
myVar += 1

print myVar #!!myVar = 0!!
Run Code Online (Sandbox Code Playgroud)

Bla*_*rad 9

我在这看到很多好的答案.但是,如果要创建自己的类型,可以查看Python Data模型文档.它解释了如何创建具有自定义行为的类,例如模拟数字类型.

有了这些信息,您可以创建一个类似的类:

class Num:
    def __init__(self, n):
        self.n = (n % 256)

    def __repr__(self):
        return repr(self.n)

     def __add__(self, other):
        return Num(self.n+int(other))

    # transform ourselves into an int, so
    # int-expecting methods can use us
    def __int__(self):
        return self.n
Run Code Online (Sandbox Code Playgroud)

然后你可以做这样的事情:

>>> a = Num(100)
>>> print a
100
>>> b = a + 50
>>> print b
150
>>> c = Num(200)
>>> d = a + c
>>> print d
44
Run Code Online (Sandbox Code Playgroud)

我意识到您可能希望支持比我所示更多的操作Num,但是从这个示例和文档中,应该相当清楚如何添加它们.


Mar*_*off 5

您必须myVar &= 0xFF要确保它保持在0-255范围内.

您通常可以根据需要对数字进行尽可能多的操作,只要在打印之前屏蔽它,发送到用C编写的方法,或者需要它在8位范围内的任何操作.


fma*_*ark 5

ctypes模块包含您需要的功能,尽管是一种难以使用的形式.例如:

>>> import ctypes
>>> ctypes.c_ubyte(255)
c_ubyte(255)
>>> ctypes.c_ubyte(255 + 1)
c_ubyte(0)
Run Code Online (Sandbox Code Playgroud)

这也适用于签名类型:

>>> ctypes.c_byte(127 + 1)
c_byte(-128)
Run Code Online (Sandbox Code Playgroud)

您可以取消对象的对象以获取原始int,如下所示:

>>> ctypes.c_byte(127 + 1).value
-128
Run Code Online (Sandbox Code Playgroud)