计算机中如何存储int类型的变量值呢?

首先,计算机的内存本质是电路板,电路板有电容器,电容器会有两个状态有电和没电,那么就可以用这两个状态来记录数据,即可以表示0和1这两个数值。这大致就是计算机中存储数据的最底层的思想。也即是说,在计算机的自己的认知中,只有0和1两个概念,他并知道2或者9.235或者“张三”这些数据。那么在现实中的各种数据就必须通过某种方式来转换成0和1的形式,最后才能存储到计算机中,如果要取数据,就按照之前的转化方法逆向解析0和1,生成现实中的数据。这其实是涉及到了编码的知识。必须有一种全世界都认同的编码方法,能够把现实世界中的数据转化为0和1,这个公认的方式是由IEEE来制定的。至于int类型的存储或者转化为0和1的方式自然也由IEEE制定了。


通常计算机的字长为32bit,也就是4个字节,而int类型的数据也是用32bit来存储的。

为了描述的方便,这里假设用8个bit来存int数据,原理不会变,只是数据的范围缩小了。

(1)使用最高位来表示数据的正负,0为正,1为负。

(2)除最高位以外的其余的数位表示绝对值。

(3)如果是正数,那就其余位设为正数数值,再将最高位设为0。

(4)如果是负数,则先写出其绝对值,然后求反码(按位取反),再加1。

按位求反再加一的方式,使得互为相反数的两个数相加值为0.因为原码加反码本来就是11111111,这时再加一肯定进位,也就是100000000(9位了),这个1溢出,不考虑,最后就剩下了00000000,所以这样的编码方式使得加减法的运算十分方便,直接相加就可以。其计算结果就是真实结果。


范围:

如果字长为n,那么最大为2的n-1次方-1,也就是011111。。。这个数,最小的话原本应该是刚才求出的最大数的相反数,也就是把0111111求反加1,得到10000。。。。。1。但是100000。。。。这个数不能成为任何正数的补码,就规定这个1000000表示比10000001还要小1的数了,(本质它是0的补码,但是0不需要补码),这里就是做了一个特殊规定。那么最小值就是负的2的n-1次方


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐