python基础-数据结构-int类型——你知道python的最大整数是什么吗?无限大?还是sys.maxsize?

文章目录

    • int底层源码
    • 最大整数推断

int底层源码

pythonint类型貌似并没有一个位数上线,然而我们知道其他语言的整数都是有位数,一般为32位或者64位等,那么python是怎么实现int类型没有位数限制的呢,下面这段代码是cpython仓库中实现python int的代码,int被定义为_longobject 的结构体,它的数字部分是一个_PyLongValue 的结构体,_PyLongValue 结构体有两个属性:

  • ob_digit是一个无符号整型的数组初始化长度为1,后续长度会动态改变,用于存储数字
  • ob_digit中的每一个长整数由多个 30 位或 15 位的 digit 组成,具体取决于平台。
  • 一个是lv_tag被用于存储int数据的数字个数、符号和标志
  • lv_tag 的位分配
    • 高位(ndigits = lv_tag >> _PyLong_NON_SIZE_BITS)存储的是长整数中的“数字”个数(ndigits)。
    • 2 位存储符号信息:
      • 0: 正数
      • 1: 零
      • 2: 负数
    • 第三低位(当前未使用)保留用于“immortality flag”(不死标志)。
  • 数字的个数(ndigits)存储在 lv_tag 的高位部分。

因此python中的int的长度是根据其lv_tag所能表示Number of digits(数字的个数)来决定的,由于uintptr_t32位与64位操作系统所表示的整数是不同的因此,python的位数也是不同的
在这里插入图片描述

#if PYLONG_BITS_IN_DIGIT == 30
typedef uint32_t digit; // 指定了每个数字的类型
typedef int32_t sdigit;
typedef uint64_t twodigits;
typedef int64_t stwodigits;
#define PyLong_SHIFT    30
#define _PyLong_DECIMAL_SHIFT   9
#define _PyLong_DECIMAL_BASE    ((digit)1000000000)
#elif PYLONG_BITS_IN_DIGIT == 15
typedef unsigned short digit; // 指定了每个数字的类型
typedef short sdigit;
typedef unsigned long twodigits;
typedef long stwodigits;
#define PyLong_SHIFT    15
#define _PyLong_DECIMAL_SHIFT   4
#define _PyLong_DECIMAL_BASE    ((digit)10000)
#else
#error "PYLONG_BITS_IN_DIGIT should be 15 or 30"
#endif
/******************上面的代码主要是根据不同的平台定义整数中每个元素的位数*************************/
#define PyLong_BASE     ((digit)1 << PyLong_SHIFT)
#define PyLong_MASK     ((digit)(PyLong_BASE - 1))#define PyObject_HEAD                   PyObject ob_base;#define _PyLong_SIGN_MASK 3 // 用于获得符号位
#define _PyLong_NON_SIZE_BITS 3 // 用于获得ob_digit元素的个数
typedef struct _PyLongValue {uintptr_t lv_tag; /* Number of digits, sign and flags */digit ob_digit[1];
} _PyLongValue;struct _longobject {PyObject_HEAD_PyLongValue long_value;
};
  • 这段代码根据 PYLONG_BITS_IN_DIGIT 的值定义了不同大小的 digittwodigits 类型,并定义了一些与长整数表示相关的常量。
  • PyLong_SHIFT 定义了每个 digit 的位数。
  • _PyLong_DECIMAL_SHIFT_PyLong_DECIMAL_BASE 定义了十进制表示中的一些常量。

最大整数推断

假设 lv_tag 为一个 64 位的 uintptr_t,并且 PYLONG_BITS_IN_DIGIT 为 30:

uintptr_t lv_tag = ...; // 假设这个值已经被设置
int num_digits = lv_tag >> _PyLong_NON_SIZE_BITS; // 提取数字的个数
int sign = lv_tag & _PyLong_SIGN_MASK; // 提取符号
  • 通过 lv_tag >> _PyLong_NON_SIZE_BITS 提取 lv_tag 的高位部分,可以得到长整数中的数字个数(ndigits)。
  • 通过 lv_tag & _PyLong_SIGN_MASK 提取 lv_tag 的低 2 位,可以得到长整数的符号。
  • 数值的绝对值计算公式:
    absolute value = ∑ i = 0 ndigits − 1 ob_digit [ i ] × 2 PyLong_SHIFT × i \text{absolute value} = \sum_{i=0}^{\text{ndigits}-1} \text{ob\_digit}[i] \times 2^{\text{PyLong\_SHIFT} \times i} absolute value=i=0ndigits1ob_digit[i]×2PyLong_SHIFT×i
    那我们可以从中推断python所能表示的最大整数,
  • 首先我们假设PyLong_SHIFTPYLONG_BITS_IN_DIGIT30
  • 因此我们可以计算出ob_digit中每个元素的最大值为 MAX_DIGIT = (1 << PYLONG_SHIFT) - 1= 2^30 - 1 = 1073741823
  • 接着我们可以根据lv_tag是一个64位的无符号整数,其最低3为符号标志,那么前61位是所能表示的整数的个数num_digits 最大值NUM_DIGITS = (1 << 61) - 1 = 2305843009213693951
  • 那么python所能表示的最大整数是 ∑ i = 0 num_digits − 1 ( 2 30 − 1 ) × 2 30 i = ( 2 30 ) 2 61 − 1 − 1 \sum_{i=0}^{\text{num\_digits}-1} (2^{30} - 1) \times 2^{30i} = (2^{30})^{2^{61} - 1} - 1 i=0num_digits1(2301)×230i=(230)26111这个数字大到已经远超内存限制

对于一个由 num_digits 个 30 位 digit 组成的最大整数,其值表示为:

max_int = ∑ i = 0 num_digits − 1 ( 2 30 − 1 ) × 2 30 i \text{max\_int} = \sum_{i=0}^{\text{num\_digits}-1} (2^{30} - 1) \times 2^{30i} max_int=i=0num_digits1(2301)×230i

我们可以将这个求和公式拆开来看: max_int = ( 2 30 − 1 ) × ( 1 + 2 30 + 2 60 + … + 2 30 ( num_digits − 1 ) ) \text{max\_int} = (2^{30} - 1) \times (1 + 2^{30} + 2^{60} + \ldots + 2^{30(\text{num\_digits} - 1)}) max_int=(2301)×(1+230+260++230(num_digits1))
注意到括号内的部分是一个几何级数,其公比为 2 30 2^{30} 230,项数为 num_digits

对于一个等比数列 1 + r + r 2 + … + r n − 1 1 + r + r^2 + \ldots + r^{n-1} 1+r+r2++rn1,它的和为: S = r n − 1 r − 1 S = \frac{r^n - 1}{r- 1} S=r1rn1

在这里, r = 2 30 r = 2^{30} r=230,而项数 n = num_digits n = \text{num\_digits} n=num_digits

所以: 1 + 2 30 + 2 60 + … + 2 30 ( num_digits − 1 ) = ( 2 30 ) num_digits − 1 2 30 − 1 1 + 2^{30} + 2^{60} + \ldots + 2^{30(\text{num\_digits} - 1)} = \frac{(2^{30})^{\text{num\_digits}} - 1}{2^{30} - 1} 1+230+260++230(num_digits1)=2301(230)num_digits1
将这个结果代入最大整数公式中,我们得到: max_int = ( 2 30 − 1 ) × ( 2 30 ) num_digits − 1 2 30 − 1 \text{max\_int} = (2^{30} - 1) \times \frac{(2^{30})^{\text{num\_digits}} - 1}{2^{30} - 1} max_int=(2301)×2301(230)num_digits1

可以简化为: max_int = ( 2 30 ) num_digits − 1 \text{max\_int} = (2^{30})^{\text{num\_digits}} - 1 max_int=(230)num_digits1
num_digits 的最大值为: num_digits = 2 61 − 1 \text{num\_digits} = 2^{61} - 1 num_digits=2611

将这个值代入最大整数公式中,我们得到: max_int = ( 2 30 ) 2 61 − 1 − 1 \text{max\_int} = (2^{30})^{2^{61} - 1} - 1 max_int=(230)26111

因为python的符号位并不影响存储数字的大小以及个数,所以其最小整数的绝对值与最大正数的绝对值相同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ELK的日志管理【开发实践】

文章目录 一、ELK简介1.1 ELK的作用与应用1.2 ELK的组成1.3 Elasticsearch1.4 Logstash1.5 Kibana1.6 ELK架构简述1.7 基础知识1.7.1 数据格式1.7.2 正排索引和倒排索引1.7.3 全文搜索 二、ES入门---基于HTTP的使用方式&#xff08;了解&#xff09;2.1 索引操作2.1.1 创建索引…

什么是网络流量监控系统?

目录 什么是网络流量监控系统&#xff1f; 网络流量监控系统的功能 实时监控 流量分析 故障排除 安全监控 IT运维中的网络流量监控系统应用案例 案例一&#xff1a;优化带宽使用 案例二&#xff1a;快速排除故障 案例三&#xff1a;提升网络安全 网络流量监控系统的…

04-树5 Root of AVL Tree(浙大数据结构PTA习题)

04-树5 Root of AVL Tree 分数 25 作者 陈越 单位 浙江大学 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more th…

将 vue文件转为字符串在Codemirror里面展示

第一种直接引入 import index from "./FFCesiumExample/basicOperationInterface/addIconMap.vue?raw"; index直接就是字符串。但是出现一个问题就是build的时候可以出警告&#xff0c;。so还有第二种 const readFile (filePath) > {// 创建一个新的xhr对象l…

dockers安装mysql

1.dockerhub上搜索自己需要安装得镜像版本 dockerhub网址&#xff1a;https://hub-stage.docker.com docker pull mysql:5.7 #下载自己需要得版本2.启动容器实例&#xff0c;并且挂载容器数据卷 docker run -d -p 3306:3306 --privilegedtrue \ -v /home/mysql/log:/var/log/…

python 构造函数

在Python中&#xff0c;构造函数是一个特殊的方法&#xff0c;用于在创建类的实例&#xff08;对象&#xff09;时自动调用&#xff0c;以初始化对象的属性。构造函数在类中是通过__init__方法来定义的。它的主要作用是为新创建的对象设置初始状态&#xff0c;即初始化对象的属…

基于react native的图片放大旋转效果二

基于react native的图片放大旋转效果二 const TaskReceiveModal ({ onClick }) > {const spinValue useRef(new Animated.Value(0)).current;const scaleValue useRef(new Animated.Value(0)).current;const spinAnimation useRef(null);const spin spinValue.interpol…

微服务架构-微服务治理基础

目录 一、服务治理由来 1.1 概述 1.2 微服务治理的几个维度 1.2.1 服务定义和SLA 1.2.2 服务注册中心 1.2.3 服务生命周期管理 1.2.4 服务通信和链路治理 1.2.5 服务授权和通信安全 二、服务治理的目标与愿景 2.1 服务治理的愿景 2.2 服务治理的目标 2.2.1 标准化 …

墨天轮《2023年中国数据库行业年度分析报告》正式发布!

为明晰发展脉络&#xff0c;把握未来趋势&#xff0c;墨天轮于5月29日正式发布 《2023年中国数据库年度行业分析报告》。该报告由墨天轮联合业界专家学者共同编写&#xff0c;共330页&#xff0c;旨在梳理和洞察中国数据库行业的发展趋势、技术创新、市场动态以及面临的挑战&am…

Java-集合基础

集合 一、含义 集合是Java API所提供的一系列类&#xff0c;可以用于动态存放多个对象 (集合只能存对象)集合与数组的不同在于&#xff0c;集合是大小可变的序列&#xff0c;而且元素类型可以不受限定&#xff0c;只要是引用类型。(集合中不能放基本数据类型&#xff0c;但可以…

Source Insight 变量高亮快捷键F8 失效

SourceInsight4.0&#xff0c;使用的时候&#xff0c;高亮快捷键F8突然不能用了 查半天发现&#xff0c;是用了“有道翻译”的原因&#xff0c;热键冲突&#xff0c;如下&#xff0c;把下面的热键换一个就好了

中国商业化重水需求依赖进口满足 国内行业发展前景广阔

中国商业化重水需求依赖进口满足 国内行业发展前景广阔 重水又称氘化水或氘水&#xff0c;是水的一种&#xff0c;常温常压下为无色无味液体&#xff0c;它的摩尔质量比一般水要重。普通的水是由两个只具有质子的氢原子和一个氧16原子所组成&#xff0c;但在重水分子内的两个氢…

mac安装allure及allure:command not fund问题解决

一、下载 下载连接&#xff1a;https://github.com/allure-framework/allure2/releases 选择任意压缩包进行下载 二、解压 解压后是一个文件夹 三、打开终端 # bash终端 vim ~/.bash_profile # zsh终端 vim ~/.zshrc四、配置环境变量 export PATH/usr/bin:/bin:/usr/sb…

Flink系列二:DataStream API中的Source,Transformation,Sink详解(^_^)

在上面篇文章中已经对flink进行了简单的介绍以及了解了Flink API 层级划分&#xff0c;这一章内容我们主要介绍DataStream API 流程图解&#xff1a; 一、DataStream API Source Flink 在流处理和批处理上的 source 大概有 4 类&#xff1a; &#xff08;1&#xff09;基于本…

Python网页处理与爬虫实战:使用Requests库进行网页数据抓取

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【前端】Vuex笔记(超详细!!)

最近花了两周时间&#xff0c;完完全全的跟着Vuex官方的视频学完了Vuex并且详详细细的做了笔记&#xff0c;其中总结部分是我对于整个视频课程的总结&#xff0c;视频部分是跟着视频做的笔记&#xff0c;如果总结部分有不懂的话&#xff0c;直接去视频部分查找对应的笔记即可&a…

ios:文本框默认的copy、past改成中文复制粘贴

问题 ios 开发&#xff0c;对于输入框的一些默认文案展示&#xff0c;如复制粘贴是英文的&#xff0c;那么如何改为中文的呢 解决 按照路径找到这个文件 ios/项目/Info.plist&#xff0c;增加 <key>CFBundleAllowMixedLocalizations</key> <true/> <…

Keras深度学习框架实战(1):图像分类识别

1、绪论 1.1 图像分类的定义 图像分类是计算机视觉领域中的一项基本任务&#xff0c;其定义是将输入图像分配给预定义类别中的一个或多个。具体来说&#xff0c;图像分类系统接受一个图像作为输入&#xff0c;并输出一个或多个类别标签&#xff0c;这些标签描述了图像中的内容…

第十三届蓝桥杯物联网试题(国赛)

还是那句话不能掉以轻心&#xff0c;全力以赴吧&#xff0c;遇事不要慌&#xff0c;该做的都做了&#xff0c;冷静沉稳的处理&#xff0c;看看配置&#xff0c;看看代码&#xff0c;还是不行就重启&#xff0c;都没问题换个板子 下面对比较复杂的部分的处理过程进行展现&#x…

git报错prohibited by Gerrit: not permitted: update

git push报错&#xff1a; Push to refs/for/[branch] to create a review, or get Push rights to update the branch. Contact an administrator to fix the permissions (prohibited by Gerrit: not permitted: update)原因&#xff1a; 使用Gerrit代码审核时&#xff0c;本…