跳至正文
View Categories

1 min read

主要内容 #

1. 回顾内存 #

前面,我们说过,一个存在内存中的数,其实是由一段连续存储空间上的“有电/没电”状态表示的。

一个 int 的大小如下图所示。

在这个图中,我们特地画成两行的表格,其实是有意义的。

思考:计算机是怎么定位到某个变量,所对应的内存区域呢?

2. 在内存中定位变量 #

我们先思考一下,大师码的陈老师点了一份外卖,快递小哥是怎么知道陈老师的位置呢?

对了,是陈老师在手机上输入的“地址”

我们先看两个典型的地址:

  • 上海市闵行区东川路800号上海交通大学
  • 上海市中山北路3663号华东师范大学
  • 大家请思考一下,“地址” 有什么特点?

  • 唯一
  • 2.1 内存地址 #

    在我们的计算机内存中,其实也有“地址”
    和生活中的地址不同,内存中当然不会有“某某街道”,所以,内存中的地址,都是用数字来编号的。而且,我们一般习惯上写作十六进制。

    下面我们先来讨论一下这个地址。

    2.2 十六进制 #

    使用十六进制表示的好处是什么呢?请回忆一下:

        1111 0000 1111 0000 (2进制)
    0x  F    0    F    0;
  • 二进制中,可以直接看出来,内存中的“有电没电”状态
  • 十六进制的每 1 位,正好对应二进制的 4 位
  • 十六进制表达,既可以较为直观的看出内存状态,也较为简洁
  • 2 位十六进制数,对应于 1 字节(Byte)内存空间
  • 请问,下面的地址,是一个占多少字节(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

    从上面的计算中,我们可以得出这样的结论:

  • 32 位地址,有 2^32 个“可以存放有电/没电状态的存储单元”,
  • 64 位地址,有 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 位的计算机才可以支持。

    习题 #

    课后练习