在以前的Python2中,整型分为int和long,也就是整型和长整型, 长整型不存在溢出问题, 即可以存放任意大小的数值,理论支持无限大数字。

因此在Python3 中,统一使用长整型,用int表示,在Python3中不存在long,只有int。

这个长整形int结构其实也很简单, 在 longintepr.h 中定义:

struct _longobject {PyObject_VAR_HEADdigit ob_digit[1];
};

ob_digit它是一个数组指针。digit 可认为是 int 的别名.

即长整型在Python内部是用一个int数组digit ob_digit[n]保存值的. 待存储的数值的低位信息放于低位下标, 高位信息放于高下标.比如要保存 112233445566778899 很长,但我们的int只能保存6位(假设):
那么python就会这样存储:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
ob_digit[0] = 778899;
ob_digit[1] = 445566;
ob_digit[2] = 112233;

低位存于低索引下,高位位于高索引下。而正负符号信息由ob_size保存, 像上面的例子中对象元素个数是3, 那么ob_size = 3而如果表示数是负数的, 那么 ob_size = -3

python中整型结构中的数组,每个元素最大存储 15 位的二进制数(不同位数操作系统有差异32位系统存15位,64位系统是30位)。

如64位系统最大存储30位的二进制数,即存储的最大十进制数是 2^30-1 = 1073741823,也就是说上面例子中数组一个元素存储的最大值是1073741823。

那么存储数字 10737418231 其实是:

ob_digit[0] = 1;
ob_digit[1] = 1073741823;

需要注意的是,实际存储是以二进制形式存储,而非我们所写的十进制。

  • 十进制:1073741823 = 二进制:11111…11111(30位) 存储在高索引 1

  • 十进制:1 = 二进制:00000…000001(30位) 存储在低索引 0

1 ~ 2^30-1 需要一个数组元素存放
2^30 ~ 2^60-1 需要两个数组元素存放

以此类推……

通过代码来看:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import sysprint("2^30 = {}\n2^60 = {}".format(1024*1024*1024, 1024*1024*1024*1024*1024*1024))print("0, 1, 2^30-1, 2^30, 2^60-1 的字节大小: ",sys.getsizeof(0), sys.getsizeof(1), sys.getsizeof(1073741823), sys.getsizeof(1073741824), sys.getsizeof(1152921504606846975))

结果如下:

2^30 = 1073741824
2^60 = 1152921504606846976
数字 0, 1, 2^30-1, 2^30, 2^60-1,2^60 的字节大小:  24 28 28 32 32 36

由于Python中的int有一个基础内存占用(也就是长整形结构中PyObject_VAR_HEAD占用内存的大小,24字节),因此数字1 ~ 2^30-1 内存大小是28字节,2^30 ~ 2^60-1 内存大小是32字节,这里需要注意的是 0 占用的内存大小是24字节而非28字节!

一个数组元素的所用内存大小是4字节即32位,但其实存储数字的有效位是30位(64位系统中),少的两位去哪了???

实际存储只用了30位的原因是:指数运算中要求位移量得是 5 的倍数,可能是某种优化算法。

Python 3 的 int 类型详解(为什么 int 不存在溢出问题?)相关推荐

  1. MySQL中int类型详解

    这个代表显示宽度 整数列的显示宽度与mysql需要用多少个字符来显示该列数值,与该整数需要的存储空间的大小都没有关系,比如,不管设定了显示宽度是多少个字符,bigint都要占用8个字节. int是整型 ...

  2. 【python 笔记】集合类型详解

    目录 集合: 创建集合 集合的基本操作 集合的内建函数和方法 面向可变集合的内建函数 集合: 无序不重复的元素的组合 利用集合可以删除列表中的重复项(set()唱用作去重操作) 分类:可变集合(set ...

  3. python整数类型-Python整数类型(int)详解

    整数就是没有小数部分的数字,Python 中的整数包括正整数.0 和负整数. 有些强类型的编程语言会提供多种整数类型,每种类型的长度都不同,能容纳的整数的大小也不同,开发者要根据实际数字的大小选用不同 ...

  4. python int函数详解_Python内置函数OCT详解

    英文文档:oct ( x ) Convert an integer number to an octal string. The result is a valid Python expression ...

  5. python变量类型-Python 变量类型详解

    变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整 ...

  6. python指定变量类型_Python 变量类型详解

    变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整 ...

  7. java原生类型没有封装_Java基本数据类型与封装类型详解(int和Integer区别)

    Java基本数据类型与封装类型详解(int和Integer区别) 发布于 2020-4-19| 复制链接 摘记: int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Int ...

  8. python内置序列类型_Python序列内置类型之元组类型详解

    Python序列内置类型之元组类型详解 1.元祖的概念 Python中的元组与列表类似,都是一个序列,不同的是元组的元素不能修改而已. 2.元组的创建 元组使用小括号,列表使用方括号. tup = ( ...

  9. java 封装表单数据类型_Java基本数据类型与封装类型详解(int和Integer区别)

    int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).in ...

最新文章

  1. php 谷歌翻译api_科研福音,论文翻译神器系列!
  2. vs2012无法启动已配置的开发Web服务器
  3. UA MATH564 概率论 高阶矩的计算:有限差算子方法1
  4. mac mysql premium_详解 Navicat Premium Mac 版常用功能
  5. c语言顺序表有效元素长度,C语言版数据结构顺序表的问题
  6. word中图片超出页边距_如何在Word中更改页边距
  7. 如何搭建一个指标体系
  8. 山西能源计算机专业,山西能源学院计算机科学与技术专业2016年在四川理科高考录取最低分数线...
  9. Flexible 弹性盒子模型之CSS justify-content 属性
  10. 创建一个动物类 java_使用java面向对象创建动物类并输出动物信息
  11. DecimalFormat 用法
  12. 音视频开发(7)---流媒体服务器原理和架构解析
  13. 卸载自己编译linux的内核,Linux内核模块的编译、加载和卸载
  14. 关情纸尾-----Quartz2D-简介
  15. Multisim软件使用详细入门教程(图文全解)
  16. BootStrap--CSS组件--按钮组(btn-group)
  17. 观看加勒比海盗惊涛怪浪在线高清串流最快
  18. Redis - 几款可视化工具
  19. java相关的外文文献及翻译_外文文献及翻译:JavaandtheInternet
  20. JAVA 基础——学习

热门文章

  1. JS 活学活用正则表达式
  2. 使用Azure应用服务本地验证安卓脸书
  3. Docker使用阿里云docker镜像加速
  4. HDU 4611 Balls Rearrangement 数学
  5. ViewModelBase ObservableObject
  6. 《敏捷软件开发》学习笔记 第20章
  7. 下面有关java类加载器牛客网_下面有关java classloader说法错误的是?
  8. 东南亚“最能喝”的国家:越南取消禁止在线销售烈性酒禁令
  9. 【学习笔记】分析函数(开窗函数)
  10. 【转载】如何在归档后启用归档信息系统