C++旧版课程库
C++第 2 期查看课程总览

041 变量的地址1

主要内容

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 位的计算机才可以支持。

    习题

    课后练习