首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python int128支持

Python int128支持
EN

Stack Overflow用户
提问于 2019-01-20 14:54:34
回答 1查看 672关注 0票数 1

在python中,可以处理非常大的整数(例如,uuid.uuid4().int.bit_length()提供128个整数),但是C-API文档提供的最大的int数据结构是long long,它是一个int

我希望能够从一个int128中获得一个C PyLong,但似乎没有这样的工具。例如,AsLongLong不能处理大于2**64的python整数。

  • 我是否遗漏了一些文档,而这实际上是可能的?
  • 目前是否不可能,但存在一些解决办法?(我希望使用python中用于long long和int128的工具,例如PyLong_AsInt128AndOverflow函数)。
  • 这是即将发布的python版本中的一个计划特性吗?
EN

回答 1

Stack Overflow用户

发布于 2019-01-20 18:17:31

有几种不同的方法可以访问您想要的精度级别。

具有64位long的系统通常有128位的long long。注意,您链接的文章中写着“至少64位”。如果没有更多的工作可做,那么检查sizeof(long long)是值得的。

假设这不是您正在使用的,那么您必须仔细查看原始PyLongObject,它实际上是私有_longobject结构的一个typedef

原始位可以通过ob_digit字段访问,长度由ob_size指定。数字的数据类型以及它们持有的实际引导数由typedef digit和宏PYLONG_BITS_IN_DIGIT提供。后者必须小于8 * sizeof(digit),大于8,倍数为5(所以是30还是15,这取决于构建的方式)。

幸运的是,在copy中有一个“无文档”的方法,它将为您复制数字的字节:_PyLong_AsByteArraylongobject.h中的评论如下:

/* _PyLong_AsByteArray:将长v最小的8*n位转换为基-256整数,存储在数组字节中。通常返回0,在错误时返回-1。如果little_endian为1/true,则将MSB存储在bytesn-1处,LSB存储在字节处;否则(little_endian为0/false)将MSB存储在字节处,LSB存储在bytesn-1处。如果is_signed为0/false,如果v<0,则为错误;否则(v >= 0) n字节被填充,而MSB的位0x80没有什么特殊之处。如果is_signed为1/true,则字节填充v值的2‘s-补表示。MSB的位0x80是符号位。错误返回(-1):+ is_signed为0,v<0。本例中设置了TypeError,字节不被更改。+n不足以容纳v的全部数学值--例如,如果is_signed为0,且v中的数字比n中的数字多;或者如果is_signed为1,v<0,则n只差1点就足够大,足以容纳一个符号。在这种情况下,OverflowError是设置的,但是字节保存了真值的最小的n字节。*/

你应该可以得到一个UUID

代码语言:javascript
复制
PyLongObject *mylong;
unsigned char myuuid[16];

_PyLong_AsByteArray(mylong, myuuid, sizeof(myuuid), 1, 0);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54277671

复制
相关文章

相似问题

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