从单片机基础到程序框架(全集 2019pdf版).pdf - 第272页
二进制:110 分析: Gu8Buffe r[0]为 4。 Gu8Buffe r[1]为 5。 Gu8Buffe r[2]为 6。 【61.6 如何在单片机上练习本章节 C 语言程序?】 直接复制前 面章节中第十 一节的模板程 序, 练习代码时只需要 更改 “ C 语言学习区 域” 的 代码就可 以了, 其它 部分的 代码 不要动 。编 译后 ,把程 序下 载进带 串口 的 51 学 习板, 通过 电脑 端的串 口助 手软件 就可 以观…

break;
case 3: //第 3 堆
pCu8=&Cu8Memory_3[0]; //跟第 3 堆数据“绑定”起来。
break;
}
// for(i=0;i<3;i++) //第 1 次出现 for 循环,用来实现“赋值”的“搬运数据”的动作。
// {
// Gu8Buffer[i]=*pCu8++; //先把“数据”赋值给数组,然后“指针所存的地址”再自加 1。
// }
for(i=0;i<3;i++) //第 1 次出现 for 循环,用来实现“赋值”的“搬运数据”的动作。
{
Gu8Buffer[i]=pCu8[i]; //这类是“偏移地址”的写法,i 在这里相当于指针的偏移地址。
}
View(Gu8Buffer[0]); //把第 1 个数 Gu8Buffer[0]发送到电脑端的串口助手软件上观察。
View(Gu8Buffer[1]); //把第 2 个数 Gu8Buffer[1]发送到电脑端的串口助手软件上观察。
View(Gu8Buffer[2]); //把第 3 个数 Gu8Buffer[2]发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第 1 个数
十进制:4
十六进制:4
二进制:100
第 2 个数
十进制:5
十六进制:5
二进制:101
第 3 个数
十进制:6
十六进制:6

二进制:110
分析:
Gu8Buffer[0]为 4。
Gu8Buffer[1]为 5。
Gu8Buffer[2]为 6。
【61.6 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C 语言学习区域”的代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口的 51 学习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。

第六十二节: 指针,大小端,化整为零,化零为整。
【62.1 内存的大小端。】
C51 编译器的 unsigned int 占 2 字节 RAM(也称为内存),unsigned long 占 4 字节 RAM,这两种数据类
型所占的字节数都超过了 1 个字节,而 RAM 内存是每一个地址对应一个字节的 RAM 内存,那么问题就来了,
比如像 unsigned long 这种占 4 个字节 RAM 的数据变量,它这 4 个字节在 RAM 中的地址是“连续”的“挨家
挨户”的“连号”的,这 4 个字节所存的一个数据,它的数据高低位在地址的排列上,到底是从低到高还是
从高到低,到底是“正向”的还是“反向”?这两种不同的排列顺序,在 C 语言里用“大端”和“小端”这
两个专业术语来描述。“大端”的方式是将高位存放在低地址,“小端”的方式是将低位存放在低地址。比如:
假设有一个 unsigned long 变量 a 等于 0x12345678,是存放在 RAM 内存中的 4,5,6,7 这四个“连号”的
地址里,现在看看它在“大端”和“小端”的存储方式里的差别。如下:
(1)在“大端”的方式里,将高位存放在低地址。
0x12 存在第 4 个地址,0x34 存在第 5 个地址,0x56 存在第 6 个地址,0x78 存在第 7 个地址。
(2)在“小端”的方式里,将低位存放在低地址。
0x78 存在第 4 个地址,0x56 存在第 5 个地址,0x34 存在第 6 个地址,0x12 存在第 7 个地址。
问题来了,在单片机里,内存到底是“大端”方式还是“小端”方式?答:这个跟 C 编译器有关。比如,
在 51 单片机的 C51 编译环境里是“大端”方式,而在 stm32 单片机的 ARM_MDK 编译环境里则是“小端”方
式。那么问题又来了?如何知道一个 C 编译器是“大端”还是“小端”?答:有两种方式,一种是看 C 编译
器的说明书,另一种是自己编写一个小程序测试一下就知道了(这种方法最简单可靠)。那么问题又来了?
讲这个 “大小端”有什么用?答:这个跟指针的使用密切相关。
【62.2 化整为零。】
在数据的存储和通信中,往往要先把数据转换成以字节为单位的数组,才能进行数据存储和通信。比如
unsigned long 这种类型的数据,就要先转换成 4 个字节,这种把某个变量转换成 N 个字节的过程,就是“化
整为零”。“化整为零”的过程,在代码上,有两种常见的方式,一种是原始的“移位法”,另一种是极具优
越性的“指针法”。比如,现在以“大端”方式为例(因为本教程是用 C51 编译器,C51 编译器是“大端”方
式),有一个 unsigned long 变量 a 等于 0x12345678,要把这个变量分解成 4 个字节存放在一个数组 Gu8BufferA
中,现在跟大家分享和对比一下这两种方法。
(1)原始的“移位法”。
unsigned long a=0x12345678;
unsigned char Gu8BufferA[4];
Gu8BufferA[0]=a>>24;
Gu8BufferA[1]=a>>16;
Gu8BufferA[2]=a>>8;
Gu8BufferA[3]=a;