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

要获得与C类型转换相等的值,只需按位并使用适当的掩码。e、 g.如果unsigned long是32位:>>> i = -6884376

>>> i & 0xffffffff

4288082920

或者如果是64位:>>> i & 0xffffffffffffffff

18446744073702667240

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

这是因为尽管Python看起来将所有数字存储为符号和大小,但按位操作定义为处理两个补码的值。C以两个补码存储整数,但位数固定。Python按位运算符作用于两个补码值,但好像它们有无限个位:对于正数,它们用零向左扩展到无穷大,而负数用一向左扩展。&运算符将把左边的一个字符串改为零,只留下适合C值的位。

以十六进制显示值可能会更清楚(我将f的字符串重写为一个表达式,以显示我们对32位或64位感兴趣):>>> hex(i)

'-0x690c18'

>>> hex (i & ((1 << 32) - 1))

'0xff96f3e8'

>>> hex (i & ((1 << 64) - 1)

'0xffffffffff96f3e8L'

对于C中的32位值,正数将上升到2147483647(0x7fffffff),负数的顶部位集将从-1(0xffffffff)下降到-2147483648(0x8000000)。对于完全符合掩码的值,我们可以使用较小的掩码移除符号位,然后减去符号位,从而在Python中反转该过程:>>> u = i & ((1 << 32) - 1)

>>> (u & ((1 << 31) - 1)) - (u & (1 << 31))

-6884376

或者对于64位版本:>>> u = 18446744073702667240

>>> (u & ((1 << 63) - 1)) - (u & (1 << 63))

-6884376

如果符号位为0,则此逆过程将保持值不变,但显然它不是真正的逆过程,因为如果以不符合掩码大小的值开始,则这些位将消失。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值