pythonint长度_Python3的int类型详解(为什么int不存在溢出问题?)

更新时间:2023-05-14 01:46:18 阅读: 评论:0

pythonint长度_Python3的int类型详解(为什么int不存在溢出
问题?)
在以前的Python2中,整型分为int和long,也就是整型和长整型, 长整型不存在溢出问题, 即可以存放任意⼤⼩的数值,理论⽀持⽆限⼤数字。
因此在Python3 中,统⼀使⽤长整型,⽤int表⽰,在Python3中不存在long,只有int。
这个长整形int结构其实也很简单, 在 longintepr.h 中定义:
struct _longobject {
PyObject_VAR_HEAD
digit ob_digit[1];
};
ob_digit 它是⼀个数组指针。digit 可认为是 int 的别名.
英文童话即长整型在Python内部是⽤⼀个int数组(digit ob_digit[n])保存值的. 待存储的数值的低位信息放于低位下标, ⾼位信息放于⾼下标.⽐如要保存 112233445566778899 很长,但我们的int只能保存6位(假设):
那么python就会这样存储:
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(30位) 存储在⾼索引 1
⼗进制:1 = ⼆进制:000001(30位) 存储在低索引 0
1 ~ 2^30-1 需要⼀个数组元素存放
我的生日礼物
2^30 ~ 2^60-1 需要两个数组元素存放
以此类推……
通金魔方通过代码来看:
import sys
print("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 的字节⼤⼩: ",sizeof(0), sizeof(1), sizeof(1073741823),
结果如下:
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 的倍数,可能是某种优化算法。

本文发布于:2023-05-14 01:46:18,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/895141.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:元素   数组   信息   需要   低位   进制   可能   保存
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图