主要内容 #
1. 回顾内存 #
前面,我们说过,一个存在内存中的数,其实是由一段连续存储空间上的“有电/没电”状态表示的。
一个 int 的大小如下图所示。
在这个图中,我们特地画成两行的表格,其实是有意义的。
思考:计算机是怎么定位到某个变量,所对应的内存区域呢?
2. 在内存中定位变量 #
我们先思考一下,大师码的陈老师点了一份外卖,快递小哥是怎么知道陈老师的位置呢?
对了,是陈老师在手机上输入的“地址”。
我们先看两个典型的地址:
大家请思考一下,“地址” 有什么特点?
2.1 内存地址 #
在我们的计算机内存中,其实也有“地址”。
和生活中的地址不同,内存中当然不会有“某某街道”,所以,内存中的地址,都是用数字来编号的。而且,我们一般习惯上写作十六进制。
下面我们先来讨论一下这个地址。
2.2 十六进制 #
使用十六进制表示的好处是什么呢?请回忆一下:
1111 0000 1111 0000 (2进制) 0x F 0 F 0;
请问,下面的地址,是一个占多少字节(Byte)的数?
0x7cff15e8
答案是 4 字节。
因为这是一个 8 位的十六进制数,而每两位十六进制数表示一个字节,所以,这个数一共占 8/2 = 4 字节。
请看上面的地址变化
0x7cff15e8 -> 0x7cff15e9 -> 0x7cff15ea
相邻的两个地址,相差 1 。而且,这里的每个存储单元,只能保持两个状态,有电 / 没电。
2.3 地址范围 #
请问,下面的地址,是一个占多少位(Bit)的数?
0x7cff15e8
解析:
在上面的分析中,这个数是一个 8 字节的数。
1 字节 = 8 位
所以,这个数是 4*8 = 32 位(Bit)。
这个 32 位其实是我们电脑上的一个重要参数。先来看一下,在电脑上哪里可以看到这个参数:
请打开“计算机” -> “右键” -> “属性” -> “系统类型”
大家电脑上。这里应该也是显示的是 64 位。
这是因为电脑的进步速度太快了,在几年前,市面上还是以 32 位的计算机居多。现在已经几乎都是 64 位的计算机了。
为了方便讲解,我们把 “32 位”和 “64 位” 放在一起讲解。
来看一下,32 位和 64 位 计算机的地址差异
示例:(十六进制数书写的间隔只是为了方便阅读,在代码中,不能有空格) 0x0c0f 15e8 // 32 位地址 0x1c4f 2c3f 13e8 160d // 64 位地址
请用十六进制,分别写出 4 字节 和 8 字节数的表示范围
4 字节 和 8 字节数的表示范围: 0x0000 0000 - 0xFFFF FFFF // 32 位,4 字节 0x0000 0000 0000 0000 - 0xFFFF FFFF FFFF FFFF // 64 位,8 字节
请将以上的十六进制数,转化为十进制数
十进制: 0x0000 0000 - 0xFFFF FFFF // 32 位,4 字节 0 - 4,294,967,295 0 - 2^32 0x0000 0000 0000 0000 - 0xFFFF FFFF FFFF FFFF // 64 位,8 字节 0 - 18,446,744,073,709,551,616 0 - 2^64
从上面的计算中,我们可以得出这样的结论:
请完成下面的单位换算:
2^32 bit 等于多少 GB?
2^64 bit 等于多少 GB?
答案:
2^32 bit = 4 GB // 32 位,4 字节 2^64 bit = 2^32 GB // 64 位,8 字节
对我们生活的意义
32 位的计算机,它最多只有 2^32 个“存储单元”,也就是 2^32 个位(Bit),也就是 4 GB 。
这意味,32 位的电脑,他的内存不能超过 4 GB。
而 64 位的计算机,它的内存最多可以支持 2^32 GB。
现在,我们主流的计算机配置,内存都在 8 GB 以上,所以只有 64 位的计算机才可以支持。