今天学习非常累,因为和汽车比较相关所以钻研比较深,汽车人别的代码可以不懂,这里一定要深入学习一波!
- 宏:
想要一个宏直接表达X+Y的和,我们如下写了一个代码,并且运行:
#define MAX 1000//define 定义常量
//define 定义宏
#define ADD(X,Y) X+Y
int main()
{
printf("%d\n", 4 * ADD(2, 3));
}
注意定义了ADD(X,Y)为X+Y后,运算的结果我们期待的是4*(2+3),其实运算方法为4*2+3=11如下,宏并不是一个函数值,只是单纯替换过来。
正确的写法如下#define ADD(X,Y) ((X)+(Y)),因为X和Y不一定是个普通的变量也可能是表达式,所以要括起来。运行结果如下
- 指针
现实生活中空间使用和内存有相似。内存也是一个空间,并且会对内存的地址进行编号,所以产生以下两个问题:
- 内存是怎么编号的
- 一个这样的内存单元室多大空间
32位-32根地址线-物理线-通电-正电1/负电0
64位-
电信号转换成数字信息:1和0组成的二进制序列。
32根地址线产生的2进制序列的可能性有:
00000000000000000000000000000000(32个0)
00000000000000000000000000000001
。。。。。。。。。。。。。。。。
01111111111111111111111111111111
10000000000000000000000000000000
。。。。。。。。。。。。。。。。
11111111111111111111111111111111(32个1)
总共2的32次方个序列,这些序列都可以作为内存的编号,这个编号就是内存单元的地址,比如01111111111111111111111111111111
计算机单元:
Bit、byte、kb、MB、GB、TB、PB(can信号常用BIT和byte)
1bit可以表示0、1两种可能。1byte=8bit可以表示28=256种可能,可以表示0到255.在CAN信号中,报文一个字节就是两个16进制的数字表示,比如00代表0,FF代表15*16加15=255. 1个字节长度报文表达00000000到11111111,表达00到FF。信号长度为1bit可以表达两种状态,信号长度为2bit可以表达4种状态,信号长度为3bit可以表达8种状态,信号长度为8bit可以表达256种状态也就是1个字节。一个字节可以是256种XX但是你看到其中一种状态也可以说他的长度是一个字节比如FF是一个字节长度。Can格式为8个字节,CANFD可以发送64字节。那么也就是00000000(一个字节)000000共14个高低电平即可表达CANFD的一帧报文的信息。
一个内存单元位1byte,1byte=8bit。
00000000000000000000000000000000(bit)有两种可能
01111111111111111111111111111111(byte=8bit)有28种可能
10000000000000000000000000000000(kb=1024byte)有28*210种可能
11111111111111111111111111111111(mb=1024kb)28*210*210种可能
所以一般想表达两种状态,1个bit长度的报文即可,想表达4种状态,2个bit即可。而SOC这种0到100,精度为小数的,才有1000种可能,才会占据10个bit,2的10次方即可。
下面在vs里试试,
如图我定义a=10,然后查a存储的地址,在000000AF1D0FF744,存储值为0a,然后是 00 00 00,a代表10,000000AF1D0FF745储存的是00,46也是0047也是00,所以再往下一行就是000000AF1D0FF748,存储了3b,然后3个字节都是00,这是16进制位的数,再往下是000000AF1D0FF74C(c是12的意思)。
打印地址的代码如下
int main()
{
int a = 10;//a在内存中要分配空间-4个字节
printf("%p\n", &a);//%p用于打印地址
return 0;
}
int main()
{
int a = 10;//a在内存中要分配空间-4个字节
printf("%p\n", &a);//%p用于打印地址
int* pa = &a;//pa是用来存放地址的,为指针变量
return 0;
}
其中pa为指针变量,指针变量前*代表pa是指针变量,int代表指针变量执行对象是int。
int main()
{
int a = 10;
int* pa = &a;
*pa= 20;//解引用操作, * pa就是通过pa里面的地址找到a。
printf("%d\n",a);
return 0;
}
也可以通过*pa找到地址,代码如上,结果如下
指针的大小是相同的。指针需要多大空间取决于地址的存储需要多大空间。32位机,指针有32个bit,也就是4。64位机有64个bit位也就是8个字节。比如说32位机的一个地址为01111111111111111111111111111111这个大小就是32个bit,4个字节的大小。