C语言学习-day9

今天学习非常累,因为和汽车比较相关所以钻研比较深,汽车人别的代码可以不懂,这里一定要深入学习一波!

想要一个宏直接表达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不一定是个普通的变量也可能是表达式,所以要括起来。运行结果如下

  1. 指针

现实生活中空间使用和内存有相似。内存也是一个空间,并且会对内存的地址进行编号,所以产生以下两个问题:

  1. 内存是怎么编号的
  2. 一个这样的内存单元室多大空间

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个字节的大小。

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值