首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在python中获取long的带符号整数值?

如何在python中获取long的带符号整数值?
EN

Stack Overflow用户
提问于 2009-09-03 20:54:39
回答 5查看 59.3K关注 0票数 31

如果lv存储长值,且机器为32位,则以下代码:

代码语言:javascript
复制
iv = int(lv & 0xffffffff)

结果是一个long类型的iv,而不是机器的int。

在这种情况下,我如何获得(带符号的)int值?

EN

回答 5

Stack Overflow用户

发布于 2012-02-20 01:13:35

代码语言:javascript
复制
import ctypes

number = lv & 0xFFFFFFFF

signed_number = ctypes.c_long(number).value
票数 35
EN

Stack Overflow用户

发布于 2009-09-03 21:03:04

您使用的是一种高级脚本语言;从本质上讲,您运行的系统的本机数据类型是不可见的。您不能使用这样的代码强制转换为本机带符号int。

如果您知道要将值转换为32位有符号整数--不管是哪种平台--只需使用简单的数学方法进行转换:

代码语言:javascript
复制
iv = 0xDEADBEEF
if(iv & 0x80000000):
    iv = -0x100000000 + iv
票数 21
EN

Stack Overflow用户

发布于 2016-05-08 11:17:03

本质上,问题是符号从32位扩展到...无限大的位数,因为Python有任意大的整数。通常,符号扩展是由CPU指令在强制转换时自动完成的,所以有趣的是,这在Python中比在C中更难。

通过尝试,我发现了一些与BreizhGatch的函数类似的东西,但这不需要条件语句。n & 0x80000000提取32位符号位;然后,-保持相同的32位表示,但对其进行符号扩展;最后,在n上设置扩展的符号位。

代码语言:javascript
复制
def toSigned32(n):
    n = n & 0xffffffff
    return n | (-(n & 0x80000000))

Bit Twiddling Hacks提出了另一种可能更通用的解决方案。n ^ 0x80000000翻转32位符号位;然后- 0x80000000将对相反的位进行符号扩展。另一种思考方式是,最初,负数高于正数(由0x80000000分隔);^交换位置;然后-将负数移到0以下。

代码语言:javascript
复制
def toSigned32(n):
    n = n & 0xffffffff
    return (n ^ 0x80000000) - 0x80000000
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1375897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档