1.将一个16位的变量存放在两个8位的变量中。
buf[0] = (UINT8)(Bat_Information.BatType >> 8);
buf[1] = (UINT8)(Bat_Information.BatType & 0X00ff);
其中,Bat_Information.BatType位16位,buf[1]为8位。前面的强制转换也可以省略。
反过来类似。
Bat_Information.BatType = (((UINT16)buf[1]<<8) | buf[0]))
2.在对全部数组元素赋初值时,可以不指定数组长度。
eg;inta[]={1,2,3,4,5};
但如果当输出第a[5]以上的元素时,系统回输出随机数值,所以使用此方法时,不能使用超过初始值元素以上的元素。
3.用或运算,可使某位置为1,其它位不变.
eg: PINSEL0 |= 0x00000005; //设置串口引脚
使第0位和第二位置一,其他位不变。
同样的,与运算的话,是让某几位位置为0,其他位不变。
eg:
(Bat_Information.BatType & 0X00ff);
3.函数指针
C语言中函数名直接对应于函数生成的指令代码在内存中的地址,因此函数名可以直接赋给指向函数的指针。
调用函数实际上等同于“调用指令+参数传递处理+回归位置入栈”,本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器。
因为函数调用的本质是跳转到某一个地址单元的code去执行,所以可以“调用一个根本就不存在在函数实体。
4.共用体.
共用体把几种不同数据类型的变量存放在同一块内存里。公用体中的变量共享同一块内存。
定义公用体类型变量的一般形式为:
union 共用体名
{
成员列表;
}变量列表;
在共用体中同一块内存可以用来存放几种不同类型的数据,但在某一时刻只能在其中存放一个成员变量。共用体变量中起作用的成员是最后一次存入的数据。
#include <stdio.h>
union data
{
int i;
char c;
double d;
};
union data a;
void main(void)
{
a.i = 50;
a.c = 10;
printf("%d\n %d\n",a.i,a.c);
return;
}
最后输出的是两个10;
即共用体变量a中的成员i已经没有值了,因为存储该值的内存现在已经被用来存储成员c的值了。
共用体变量的长度取决于其成员的最大长度。
结构体变量所占内存的长度是各个成员的总和,每个成员分别占有自己的存储空间。共用体变量所占内存的长度是其最长成员的长度。当然,编译器出于提高访问效率的目的,在编译分配存储空间时往往要进行对齐操作。
5.CPU字长与存储器位宽不一致处理。
例如:使用共用体来解决这一冲突:
union send_temp{
uint16 words;
uint8 bytes[2];
}send_buff;
eg:send_buff.bytes[0]=a;//此处a 是8位
send_buff.bytes[1]=b;//此处 b 是8位;
此时就将8位字拼成了16位字存储了。
发送时send(send_buff.words)就可以每次发送一个16位的数据了。
这个在项目工程里也有很多地方用到。
eg:
lcd_digit.val = TOUMode.words[i-1];//TimeOfUse[ptrToU].words[i-1];
6.宏定义取两个,四个之间的最小值最大值。
这个简单,只是做一下记录。
#define min(a,b,c,d) (a<b?a:b)<(c<d?c:d)?(a<b?a:b):(c<d?c:d)
#define max(a,b,c,d) (a>b?a:b)>(c>d?c:d)?(a>b?a:b):(c>d?c:d)
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
7.小代码块
下面两个小代码块,一个for循环是利用cnt来记录4页中哪几页使能了,使能了的位就置1;
下面的while代码块是计算出使能的页数。
for(i = 0; i < PAGE_OF_USE_MAX; i++)
{
if(PageofUse[i].bit.enable)
{
if (i==0) cnt |= 0x01;
else if (i==1) cnt |= 0x02;
else if (i==2) cnt |= 0x04;
else if (i==3) cnt |= 0x08;
}
else
}
while(cnt)
{
if(1 == (n&0x01))
{
compare_cnt++;
cnt >>= 1;
}
}
8.数组地址是常量地址,不可以进行+操作,如果想进行+操作,先进行强制数据类型转换。
eg:
short a[5] = {1,2,3,4,5};
printf("%d \n",a);
printf("%d \n",a + 1);
printf("%d \n",a + 2);
printf("%d \n",a + 3);
printf("%d \n",a + 4);
printf("%d \n",*a);
// printf("%d \n",*(a + 1));
printf("%d \n",*(short *)(a + 1));
9.float 的精度问题:
float能保证的精度是至少有效位数是7位,之后的无法保证。
https://blog.csdn.net/albertsh/article/details/92385277
因为精度问题,因此浮点型的变量不能直接进行等值比较,或者判断==0之类的操作。如果想要比较,先转换成整型的再比较。
10.break使循坏提前跳出,continue强迫程序提前进入下一轮循环;