文章目录
1、概述
在计算机中要访问存储区,都是通过地址来进行访问的,包括所有的外设(比如串口、内存、硬盘等),都对应有一个访问地址,地址就相当于门牌号,有了门牌号,我们才知道操作的是哪一个区域、哪一个外设。
最被大家熟知的是计算机内存,计算机内存有4G、8G,16G等等,对于程序员而言,要在代码中操作这些内存,肯定得知道内存的地址,此外,还需要会计算 【地址】 与 【内存大小】 的 【计算方法】 与 【对应关系】。STM32作为微型计算机,原理也是一样。
本篇博客则以STM32F103为例,主要对地址的计算相关的问题进行阐述。
2、公式
2.1 G/M/K/Byte/bit 单位换算公式
基本概念1:单位换算公式
2.2 地址与字节大小的关系
基本概念2:在计算机中,一个地址,代表一个字节(1Byte)。
基本概念3:我们常说的8位机、16位机、32位机、64位机,指的是地址的长度。
即:地址最长可以有几个比特位,例如:8位机地址最长8个比特位,最大地址0xFF。
基本概念3含义详细解释如下:(备注:此处直接阐述结果,后面有详细的计算方法。)
因为计算机只能识别二进制0/1,寻址的时候也一样是通过二进制0101来寻址的,我们常说的32位机、64位机,指的是地址的2进制长度。比如:
8位机,地址长度是 8个二进制bit,最长0xFF。 地址范围:0x0 - 0xFF, 即:最大可以表示2^8 == 256个地址,即:256个字节
16位机,地址长度是 16个二进制bit,最长0xFFFF。 地址范围:0x0 - 0xFFFF, 即:最大可以表示2^16 == 64k个地址,即:64k个字节
32位机,地址长度是 32个二进制bit,最长0xFFFF FFFF。地址范围:0x0 - 0xFFFF FFFF,即:最大可以表示2^32 == 4G 个地址,即:4G个字节
64位机,地址长度是 64个二进制bit,最长0xFFFF FFFF FFFF FFFF(16个F)。地址范围:0x0 - 0xFFFF FFFF FFFF FFFF(16个F),即:最大可以表示2^64==2GG个地址,即:2GG个字节
比如:地址0x0000 0000就占一个字节,
地址0x0000 0001也占一个字节,
地址0x0000 0002也占一个字节,
…
地址0x0000 000F也占一个字节,
也就是说:
0x0000 0000 - 0x0000 000F总共有16个地址,占16个字节。
可以推出公式:
备注:十六进制1位 = 二进制4位,计算机只能识别二进制:1101 0101这种,所以要换算成二进制计算
{ 0 x 0000 , 000 F = 0 b . . . . , 0000 , 1111 = 2 4 = 16 (个字节) \begin{cases} 0x0000,000F &= \quad 0b....,0000,1111\\ &= \quad 2^4 \\ &= \quad 16(个字节)\\ \end{cases} ⎩
⎨
⎧0x0000,000F=0b....,0000,1111=24=16(个字节)
所以套用成通用公式表示的话,可以表示为如下几个公式。
2.3 公式1:0xFF…FF (n个F)大小
公式1:地址 0xFF…FF (n个F)的地址大小为:
0 x F F . . . F F M e m o r y S i z e = 2 ( 4 ∗ n ) \color{red}{ \boldsymbol{ 0xFF...FF \quad MemorySize \, = \, 2^{ \: (4 \, * \, n)} } } 0xFF...FFMemorySize=2(4∗n)
换句话说,其实就是换算成二进制格式以后,1占多少个bit,大小就为 【 2 b i t 】 \color{blue}【{2^{bit}} 】 【2bit】字节。因为十六进制1位,等价于二进制4位(如:F == 1111),所以n个F占 【 4 ∗ n 】 \color{blue}{【4 * n 】} 【4∗n】位,所以此公式为 【 2 ( 4 ∗ n ) 】 \color{blue}【{2^{(4 * n)}} 】 【2(4∗n)】
2.4 公式2:0xmFF…FF (m后跟n个F)大小
公式2:地址 0xmFF…FF (n个F)的地址大小,等价于(m + 1)个0xFF…FF大小之和
0 x m F F . . . F F M e m o r y S i z e = ( m + 1 ) ∗ 2 ( 4 ∗ n ) \color{red}{ \boldsymbol{ 0xmFF...FF \quad MemorySize = (m + 1) * 2^{ \: (4 \, * \, n)}\\ } } 0xmFF...FFMemorySize