在Python中从有符号整数转换为无符号整数

时间:2012-10-16 14:28:33

标签: c++ python

首先,请原谅我无知问这个问题,但我不能帮助,因为我不擅长Python。

我遇到了以下需要转换为C ++的Python代码。

def getSignedNumber(number, bitLength):
    mask = pow(2,bitLength) - 1
    if number & (1 << (bitLength - 1)):
        return number | ~mask
    else:
        return number & mask


def getUnsignedNumber(number, bitLength):
    mask = pow(2,bitLength) - 1
    return number & mask

这用于将unsigned int转换为signed int,反之亦然。但我不知道为什么我们必须这样做,因为我认为只是投射到相应的类型就足够了。也许是因为Python是一种动态类型语言并且需要这种操作?我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您的意思是reinterpret_cast还是dynamic_cast

长话短说:你需要这个任意位长整数。下面的解释尝试:

getUnsignedNumber解释一块内存,就像一个nBit号码。这是必要的,因为你只获得了某些块大小的内存(通常你不能分配3bit,你需要分配下一个更大的单元,一个字节(char))。因此,您需要确保忽略不需要的5个额外位。

getSignedNumber对带符号的数字执行相同操作,但是如果数字为负数,我们需要使用符号位填充。因此,即使对于c,您也需要此功能。 (想象一下,你在你的char中存储-3并希望将其作为无符号3位数字读取)

看来,这用于正确填充数字,比如你有一个字符:

c = 10001111

现在如果你想将它解释为四位有符号类型,你实际上必须放

c = 11111111

因为如果一个数字在二进制补码中为负,那么它之前的所有位实际上都是一位。但是,如果将其解释为5位有符号类型,则会看到符号位为0,因此所有前导位应为零。所以你必须掩盖它以便

c = 00001111