pyhon-整数以及内存表示方式

    从这一章我们就开始一起开始进入学习python的阶段了,在前面几章,我讲了一些正式学习python之前最好需要了解的知识,从这一章开始,我讲开始讲授python语言本身。这个章节我打算来谈一谈python种的第一个大的类型,数字。当然,还是秉承我一贯理念,我们不仅仅是学习python语言本身,还要学习计算机相关的基础知识。

    1 数字的类型

        谈到数字,如果读过我之前的文章,明白数字是常量,所以数字是不可改变的对象。python的数字有以下几种类型:整数,浮点数,复数。注意,我们现在所谈论的python的语法,都是基于python3.0之后的。这一章我们先谈整数。

    1.1 整数

    如果学过C,都明白整数是有精度的,一般32位的机器,整数(int类型)是32位的,所以能表示的大小是确定的。但是python中的整数是没有大小限制的,只要你内存够,就可以表示无限大小。看一下下面这段代码:

print(2**100-1)

打印出的结果是: 1267650600228229401496703205375,这是一个相当大的数字。这个代码是2的100次方减1,如果是C代码,假如是32位机,这个运算会得出一个不可思议的结果,因为产生了溢出。什么是溢出呢?当前的这个例子,我们要放这个超级大的数,需要101位才能放置,最高位是符号位。假如现在我们有101位来存放这个数,这个数在内存中是如何表示的?

    我们都知道,内存中都是比特(bit)表示的,每个比特代表1位,这个值不是1就是0,也就是我们所说的二进制表示。对这个1267650600228229401496703205375数值,我们在内存中最高位是符号位,因为是整数,所以最高位为0,剩下的100位全部为1,就像下面这样:

当然,python自己有一套存储超大整数的机制,我相信不会像我这样用101位来表示,最起码会用8的倍数位来表示,在这里我只是为了说明问题。

刚才我们谈到,在C中,这样就会产生溢出,因为C中是32位的长度来表示整数(int类型),所以这个超大整数会被截断,变成32位。截断的是高位截断,所以在C中,32存储了101位中低的32位,所以最后在C中这个32位存储的全是1,我们都知道,最高位是符号位,所以这个数字的值变成了-1。这个数字是不是有点奇怪,本来是正数,最后却变成了负数。我们把这种情况叫做溢出,因为超出了32位表示的范围,就像水桶满了,剩下的水就溢出去了。至此,我相信大家都明白了什么是溢出,我们本来需要101位才能表示这个数,但是目前只有32位,所以溢出去了69位,这样说虽然有点奇怪,不过很形象。

再回过头看这个数的内存表示,为什么我知道第一位是0,剩下的100位都是1呢。

这个涉及到一个换算的问题,我们如何将一个二进制转换为十进制呢?这引出了另外一个话题。

1.1.1 整数的表示方式

    我们知道内存中整数是以二进制存储的,我们写代码的时候基本上是以十进制形式书写的,当然还有八进制,十六进制,如果你愿意,也可以用二进制书写,因为二进制的位数太长,书写很不方遍,一般我们用十六进制表示的多。看一下下面的代码:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小白快快跑哦

您的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值