32位和64位

代码,最后会变成一堆01机器码,放在可执行文件里,躺在磁盘上
在这里插入图片描述

执行

  1. 文件:硬盘->内存->CPU

  2. CPU:

    1. 内存数据->总线->寄存器
    2. 寄存器->总线->内存

在这里插入图片描述

CPU位数

在这里插入图片描述

  1. 寄存器:存放数值,大小叫位宽。32位CPU能放入最大2^32 的数值,
    64位就是最大2^64的值。32位位宽的CPU就是常说的32位CPU,同理64位CPU也是一样。

  2. 总线:CPU跟内存之间,是用总线来进行信号传输的,总线可以分为数据总线,控制总线,地址总线。
    32位CPU的总线宽度一般是32位,最大能寻址的范围,也就到2^32,就是4G。
    64位CPU,按理说总线宽度是64位,但实际上是48位,所以寻址范围能到2^48次方,也就是256T。

系统和软件的位数

  1. 在操作系统上运行一个用户态进程,会分为用户态和内核态,并设定一定的内存布局。
  2. 操作系统和软件都需要以这个内存布局为基础运行程序。32位机器,内核态分配了1个G,用户态分配了3G,总不能将程序的运行内存边界设定在大于10G的地方。所以,系统和软件的位数,可以理解为,这个系统或软件内存寻址的范围位数。
    在这里插入图片描述

int32和int64

int32也就是用4个字节,32位的内存去存储数据,int64也就是用8个字节,64位去存数据。这个数值就是刚刚CPU运行流程中放在内存里的数据。

32位的CPU能进行int64位的数值计算吗?

能,但比起64位的CPU,性能会慢一些。

  1. 64位的CPU在计算两个int64的数值相加时,可以将数据通过64位的总线,一次性存入到64位的寄存器,并在进行计算后返回到内存中。

  2. 32位的CPU,虽然在代码里放了个int64的数值,但实际上CPU的寄存器根本放不下这么大的数据,因此最简单的方法是,将int64的数值,拆成前后两半,现在两个int64相加,就变成了4个int32的数值相加,并且后半部分加好了之后,拿到进位,才能去计算前面的部分,这里光是执行的指令数就比64位的CPU要多。所以理论上,会更慢些。

python中number没有长度限制

struct PyLongObject{
long ob_refcnt;                // 引用计数,64位系统占8 bytes, 32位系统占4 bytes
struct_typeobject *ob_type;    // 类型指针,64位系统占8 bytes, 32位系统占4 bytes
long ob_size;                  // 数据部分int的个数,64位系统占8 bytes, 32位系统占4 bytes
unsigned int ob_digit[1];      // 64位系统占4 bytes * abs(ob_size); 32位系统占2 bytes * abs(ob_size);
};

对于64位Python:

ob_refcnt,ob_type,ob_size各占8字节。当ob_size为0时,ob_digit不存在,否则其字节数为4abs(ob_size),所以最少为83=24字节,而且每次增量都是4的倍数。

对于32位Python:

ob_refcnt,ob_type,ob_size各占4字节。当ob_size为0时,ob_digit不存在,否则其字节数为2abs(ob_size),所以最少为43=12字节,而且每次增量都是2的倍数。

采用这种处理方式,Python的整型变量基本上可做到无长度限制。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Generalzy

文章对您有帮助,倍感荣幸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值