打印

单片机类型系统和数据变量

[复制链接]
655|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 小小蚂蚁举千斤 于 2023-12-16 16:53 编辑

一、类型系统

很简单,往格子 3 处放个数字 29,往格子 6 处放个数字 38,就这么简单直接地描述即可。



但是这样说话太麻烦了,什么往格子 3 处放个数字 29 的,废话太多,也不方便不讲感情的计算机去理解。

那我们就定个指令,使用 mov $x, (y) 表示把数字 x 放入格子 y,如下:

mov $29, (3)
mov $38, (6)

这就表示刚刚说的:

把数字 29 放入内存格子 3
把数字 38 放入内存格子 6
是不是太简单了?别急,好戏马上开始!

如果要把数字 999 放入内存格子 8,该怎么办呢?

由于 1 个格子表示 1 个字节,只有 8 位,因此只能表示 256 个数字,要么是有符号的 -128 ~ 127,要么是无符号的 0 ~255,显然数字 999 无法放在 1 个格子内,只能占用 2 个格子了。

那也好办,就这么说,把数字 999 放入格子 8,连续占用两个格子。



但这样,我们刚刚的 mov 指令就得改改了,不但要表示"存放"这个含义,还得表示占用了多少个格子。

我们用 movb 表示只占 1 个字节,用 movw 表示占用 2 个字节。那么,刚刚的三个数字,就分别可以这样用指令来表示了:

movb $29, (3)
movb $38, (6)
movw $999, (8)

含义就是:

把数字 29 放入内存格子 3,占 1 个字节
把数字 38 放入内存格子 6,占 1 个字节
把数字 999 放入内存格子 8,占 2 个字节
OK,既然有了 1 字节和 2 字节的的指令,不妨再设计下,用 movl 表示 4 字节,movq 表示 8 字节 ...

movb 占用 1 字节
movw 占用 2 字节
movl 占用 4 字节
movq 占用 8 字节
不知不觉,类型系统就被你悄悄设计出来了!当然,虽然这只是个半成品。



使用特权

评论回复
沙发
小小蚂蚁举千斤|  楼主 | 2023-12-16 16:53 | 只看该作者
二、变量

你不断地往不同格子里放数据。

比如我把我的年龄放在 11 号格子(占 1 字节),把我的月薪放在 14 号格子(占 4 字节)。



现在我们的内存已经非常混乱了,你根本记不住原来的 3 号格子放的数据表示什么,11 号格子又表示什么,只能通过看数字知道 14 号格子里放的确实是我的月薪。这该怎么办呢?

增加一层抽象嘛!我们给这些放了我们数据的格子,都贴上个标签,就可以不用再记那些无意义的格子编号了。



这样以来,其实我们也不再关心,这些标签到底在哪个格子里,只要给我找到格子把我的数据放进去就可以了。

movb $29, a
movb $38, b
movw $999, c
movb $18, age
movl $2147483647, salary

当然,我还需要再通过这个标签,把我刚刚放进去的数据找出来。

这很简单,但存在一个问题,放进去的时候,我们可以通过 movb,movw,movl 等知道占用多少个格子。而取出来的时候,标签上可没有写这个数据占用了多少个格子,这是有问题的。

因此,在定义这个标签时,不能光取个名字,还需要有个信息就是,这个标签对应的数据,占了多少个格子。

我们就效仿刚刚的存放操作,也规定一系列单词,来修饰这些标签,表示占用了多少个格子。

char 表示 1 个字节,short 表示 2 个字节,int 表示 4 个字节,long 表示 8 个字节 ...



于是乎刚刚的 5 个数据,就可以表示为如下指令:

char a = 29;
char b = 38;
short c = 999;
char age = 18;
int salary = 2147483647;

行了,我也别藏着掖着了,相信大家也知道,这里就是 C 语言的写法,而刚刚那堆 mov 是汇编语言的写法。

这些 char a,char b,int salary 等,就是变量!记住,变量不但要有名字,还得有类型!

使用特权

评论回复
板凳
小小蚂蚁举千斤|  楼主 | 2023-12-16 16:55 | 只看该作者
三、变量定义与赋值

其实,刚刚的写法,是把变量的定义与赋值操作写在一行了。

比如有如下语句:

int a = 1;
实际上是分成两步的:

// 变量的定义
int a;
// 变量的赋值(此处也可以叫变量的初始化)
a = 1;
其中变量的定义是为了方便程序员后面去用它,这部分不是给 CPU 看的。



而变量的赋值才是真正在内存中把数据放进去,这部分才真正涉及 CPU 具体指令的执行。



也就是说,如果你仅仅定义了一个变量 int a; 但是没有给它初始化的赋值操作,那么最终在 CPU 执行指令的时候,这个定义根本就没有任何体现。


使用特权

评论回复
地板
AdaMaYun| | 2023-12-28 18:05 | 只看该作者
楼主这个讲解的很形象生动

使用特权

评论回复
5
Betty1299| | 2024-1-3 16:18 | 只看该作者
=这个挺好玩啊,不错不错

使用特权

评论回复
6
Betty996| | 2024-1-3 17:22 | 只看该作者
数据变量还分全局变量和局部变量呢,这也要注意了

使用特权

评论回复
7
Charlene沙| | 2024-1-3 18:23 | 只看该作者
其实计算机开发是枯燥的,但是要是开发完成了,觉得就是一切都值得

使用特权

评论回复
8
Estelle1999| | 2024-1-3 20:15 | 只看该作者
单片机类型系统?这是啥东西啊

使用特权

评论回复
9
alxd| | 2024-1-3 21:34 | 只看该作者
这要是用的C语言讲解就好了

使用特权

评论回复
10
Emily999| | 2024-1-4 07:24 | 只看该作者
Mov是啥函数?是汇编么?

使用特权

评论回复
11
Carina卡| | 2024-1-4 07:56 | 只看该作者
数据变量是单片机中用于存储数据的变量。单片机中的数据变量是比较多的哦

使用特权

评论回复
12
Allison8859| | 2024-1-4 09:06 | 只看该作者
其实,单片机的类型可以根据其处理器核心的架构来划分

使用特权

评论回复
13
Charlotte夏| | 2024-1-4 10:21 | 只看该作者
在单片机编程中,我们可以声明和使用这些数据变量来存储和处理数据

使用特权

评论回复
14
Belle1257| | 2024-1-4 11:04 | 只看该作者
CPU一般不都是二进制的操作的么,0和1

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

2037

帖子

1

粉丝