在Python中实现有符号整数到无符号整数的转换

2024-09-30 22:19:45 发布

您现在位置: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

它用于将无符号int转换为有符号int,反之亦然。但我不知道为什么我们要这么做,因为我觉得只要转换成相应的类型就足够了。也许是因为Python是一种动态类型语言,需要这种操作?我是不是少了点什么?在


Tags: 代码类型numberreturnifdef符号动态
1条回答
网友
1楼 · 发布于 2024-09-30 22:19:45

你是说reinterpret_cast还是{}?在

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

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

getSignedNumber对有符号的数字也是这样,但是如果数字是负数,我们需要用符号位填充。因此,即使对于c,也需要这个函数(假设您在char中存储-3,并希望将其作为无符号3位数字读取)

这似乎是用来正确填充数字的,假设你有一个字符:

c=10001111

现在,如果你想把它解释为一个四位有符号的类型,你必须

c=11111111

因为如果一个数在两个数中是负的,那么它前面的所有位都是1。但是,如果将其解释为5位有符号类型,则会看到符号位为0,因此所有前导位都应为零。所以你得把它遮住

c=00001111

相关问题 更多 >