在Python中获取从有符号整数到无符号整数的转换

Getting conversion from signed integer to unsigned integer in Python

本文关键字:整数 无符号整数 转换 符号 Python 获取      更新时间:2023-10-16

首先,请原谅我问这种问题的无知,但我无能为力,因为我不擅长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

这用于将无符号int转换为有符号int,反之亦然。但我不知道为什么我们必须这样做,因为我认为只选相应的类型就足够了。也许是因为Python是一种动态类型语言,需要这种操作?我是不是遗漏了什么?

您的意思是reinterpret_cast还是dynamic_cast

长话短说:对于任意位长的整数,您需要这样做。下面的解释尝试:

getUnsignedNumber像nBit数字一样解释存储器块。这是必要的,因为你只获得特定块大小的内存(通常你不能分配3比特,你需要分配下一个更大的单元,一个字节(char))。因此,您需要确保忽略不需要的5个额外位。

getSignedNumber对有符号数字也是如此,但在这里,如果数字为负数,我们需要用符号位填充。因此,即使对于c,你也需要这个函数。(想象一下,你把-3存储在你的char中,并想把它读成一个无符号的3位数字)

看起来,这是用来正确填充数字的,比如说你有一个字符:

c=10001111

现在,如果你想将其解释为一个四位签名类型,你实际上必须放入

c=11111111

因为如果一个数字是负数,那么它前面的所有位实际上都是一。但是,如果您将其解释为5位有符号类型,您会看到符号位为0,因此所有前导位都应为零。所以你必须掩盖它,这样

c=00001111