如何在python中将有符号转换为无符号整数

您所在的位置:网站首页 long转为无符号int 如何在python中将有符号转换为无符号整数

如何在python中将有符号转换为无符号整数

2024-05-25 02:23| 来源: 网络整理| 查看: 265

假设我有这个数字i = -6884376。 我如何将其称为无符号变量? 类似于C中的(unsigned long)i。

相关讨论 Python没有内置的无符号类型。 您可以使用abs()函数。 您可能可以使用struct库执行某些操作,但是就像BrenBarn所说的那样; Python不会分开签名。 另外,您要解决的问题是什么? @saidomar不,它不会给我无符号值,而是绝对值。 @BrenBarn我正在做某种计算,给我一个负值,但我想要无符号表示。 Python的整数类型具有无限的精度,并且不依赖于基础固定大小类型。因此,它无法区分无符号和有符号类型。您将必须自己进行转换。 @poke我如何自己做? 您所说的"我想要未签名的代表"是什么意思?在您的示例中,您期望结果是什么? 执行i = int(str(i).lstrip(-))。嘘,您未签名i! :D 可能值得注意的是,虽然pythons int不是有符号/无符号的,并且具有无限的精度,但是Python本身确实可以理解有符号和无符号整数之间的区别,例如array.array。 @ThePeacefulCoder-您的解决方案将更改数据,即一个被误解的字节,您刚刚删除了一点。 @AliSAIDOMAR否,abs函数不能给出C中(unsigned)强制转换的结果,对于2s补码,它是(uint32_t)a = (1LL

假设:

您会想到2的补码表示法;和, 用(unsigned long)表示无符号32位整数,

那么您只需将2**32 (or 1 添加到负值即可。

例如,将此应用于-1:

123456>>> -1 -1 >>> _ + 2**32 4294967295L >>> bin(_) '0b11111111111111111111111111111111'

假设1表示您希望将-1视为1位的实字符串,而假设2表示您希望其中的32个。

但是,除了你,没人可以说你隐藏的假设是什么。例如,如果考虑到1的补码表示形式,则需要使用~前缀运算符。 Python整数努力工作,给人一种使用无限宽2的补码表示的幻觉(类似于常规2的补码,但具有无限数量的"符号位")。

要复制平台C编译器的功能,可以使用ctypes模块:

12345>>> import ctypes >>> ctypes.c_ulong(-1)  # stuff Python's -1 into a C unsigned long c_ulong(4294967295L) >>> _.value 4294967295L

C的unsigned long恰好是运行此示例的框上的4个字节。

相关讨论 我不知道您可以使用_来引用上一行的结果! @ Yay295对!这仅在交互模式下可行还是可以在非交互模式下使用? @HelloGoodbye,使用"_"检索先前的结果不是语言本身的功能,而是某些(大多数?全部?)交互式Python shell实现的便利。为了显示它,他们无论如何都必须获取最新的结果。语言本身没有做到这一点。

要获得与C转换等效的值,只需按位并使用适当的掩码即可。例如如果unsigned long是32位:

123>>> i = -6884376 >>> i & 0xffffffff 4288082920

或如果是64位:

12>>> i & 0xffffffffffffffff 18446744073702667240

请注意,尽管这给了您在C语言中应有的值,但它仍然是一个带符号的值,因此任何后续计算都可能得出负结果,因此您必须继续应用该掩码以模拟32或64位计算。

之所以可行,是因为尽管Python看起来像将所有数字存储为正负号和幅度,但按位运算被定义为对二进制补码值进行处理。 C以二进制补码形式存储整数,但位数固定。 Python的按位运算符作用于二进制补码值,但是好像它们具有无限数量的位:对于正数,它们向左扩展到无穷大(零),而负数向左扩展到1。 &运算符会将左一的字符串更改为零,而只剩下适合C值的位。

以十六进制显示值可以使这一点更清晰(我将f的字符串重写为一个表达式,以表明我们对32位或64位感兴趣):

123456>>> hex(i) '-0x690c18' >>> hex (i & ((1 > hex (i & ((1 > u = i & ((1 > (u & ((1 >> (u & ((1 是BigEndian运算。 l很长。 l是无符号的。 在amd64体系结构中,int和long是32位的,因此可以分别使用i和i代替l和l。

python没有内置将int转换为unsigned int的内置函数,取而代之的是更长的范围。

123456>>> val = 9223372036854775807 (maximum value of int 64) >>> type(val) >>> val += 1 >>> type(val)

通过将val的值增加1,我超过了有符号64位整数的限制,并且该值转换为long。 如果Python使用或转换为无符号整数,则val仍然是int。 或者,不长。

有符号整数由一个位(通常是最高有效位)表示,对于正数设置为0,对于负数设置为1。 val&0xff实际上是val&0x000000ff(在32位计算机上)。 换句话说,有符号位设置为0,并且模拟无符号值。

一个例子:

123>>> val = -1 >>> val & 0xff 255

只是使用abs将无符号转换为python

123 a=-12 b=abs(a) print(b)

输出: 12

相关讨论 我觉得这只是部分正确。由于python MDN状态> abs()返回数字的绝对值。该参数可以是一个普通或长整数或浮点数。如果参数为复数,则返回其大小。根据定义,这不会一直返回unsigned变量 但他只要求整数。

从3.2版本开始:

12def toSigned(n, byte_count):   return int.from_bytes(n.to_bytes(byte_count, 'little'), 'little', signed=True)

输出:

12345In [8]: toSigned(5, 1)                                                                                                                                                                                                                                                                                                     Out[8]: 5 In [9]: toSigned(0xff, 1)                                                                                                                                                                                                                                                                                                   Out[9]: -1



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3