【嵌入式学习-C语言篇】 char & short & int 的使用

2023-11-17

【嵌入式学习-C语言篇】 char & short & int 的使用

三种数据类型常用场景

  1. 智能家居:网关协议中mac地址上报

网关:网关(Gateway)又称网间连接器、协议转换器。网关在传输层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。它是一种充当转换重任的计算机系统或设备,在使用不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同时,网关也可以提供过滤和安全功能。(从一个网络向另一个网络发送信息,也必须经过一道“关口”,这道关口就是网关。顾名思义,网关(Gateway)就是一个网络连接到另一个网络的“关口”。)

  1. 奶茶机器人:温度采集,小数点上报云端

char,short, int 类型的取值范围

在C语言中,char类型的取值范围是 -128到127 ( − 2 7 − 1 -2^{7}-1 271 2 7 − 1 2^{7}-1 271)。short类型的取值范围是 -32,768到32,767 ( − 2 16 − 1 -2^{16}-1 2161 2 16 − 1 2^{16}-1 2161)。int类型的取值范围是 -2,147,483,648到2,147,483,647( − 2 32 − 1 -2^{32}-1 2321 2 32 − 1 2^{32}-1 2321), 而前面加了 unsigned 代表没有负数,但占用的空间的地址还是和不加 unsigned 一样的空间大小。加了unsigned就是把最高位的用来表示正负的0和1不用来表示正负了,因为unsigend加了之后没有负数了,而将最高位当一位来表示数字,那么就变成了原本char类型的 -128到127成了 0到255( 0 0 0 2 8 − 1 2^{8}-1 281)(涉及到计算机导论的基础知识,很简单不解释)

unsigned char a; //0x00 - 0xff  8
unsigned short b; //0x0000-0xffff 16
unsigned int c; //0x00000000 - 0xffffffff 32

void main(){
    printf("hello world\n"); //hello world
    printf("%d %d %d\n", sizeof(a), sizeof(b), sizeof(c));  //1 2 4
    // char short int 分别占 1字节 2字节 4字节
}

使用数据类型将温度或MAC地址上传到服务器(应用)

预先定义两个变量为temp和mac分别为 float 类型和 *char **类型

float temp = 37.5;   //使用float类型表示温度,因为浮点类型可以保存小数点之后的数值
char* mac = "192.168.31.84"; //使用char* 来表示字符串, 可以间接的理解char* 等于 String,但是细节上区别还是挺多的。
那么我们是否有别的办法来表示吗?

当然可以,我们可以使用数组来表示上面的mac地址和温度

char mac_array[4] = {192, 168, 31, 84};
char temp_array[2] = {37, 5};

我们也可以使用更高级的写法,来一点不一样的操作
1.我们知道mac地址是有个四个0~255的数值构成,所以我们可以想像的是mac地址就相当于 0 ~ 28.0 ~ 28.0 ~ 28.0 ~ 28
2.我们又知道 unsigned char 可以表示的范围就是0 ~ 28
3.所以我们可以使用一个unsigned char类型的数组来表示我们的mac地址

具体操作如下:

假设mac地址为192.168.31.84
我们可以把它看成 0xc0.0xa8.0x1f.0x54 (0x代表十六进制)
因为4个char类型等于1个int类型,那么我们就可以用一个 int类型将整个mac地址存储起来 ,从底层来看,我们需要做的就是将0xc0放到int类型的前0-8位,而0xa8我们放到9-16位,0x1f放到17-24位,0x54放到25-32位。
而对于将这些二进制移动到它们原本该有的位置,这需要位移操作。我们需要左移来实现。

//假设mac地址为192.168.31.84
//我们可以把它看成0xc0.0xa8.0x1f.0x54
unsigned char mac_buffer[4] = {0xc0, 0xa8, 0x1f, 0x54};
unsigned int mac;
unsigned int u8Tou32B(unsigned char *buffer){
	//将每一个位置的数线转成unsigned int类型,主要目的是方便后面取与能够合并所有的位数的值,而之后<<8也就是左移八位,目的是让这八位移到它该对应的位置。 原理很简单,需要有位移以及取与操作知识,这些操作都是建立在二进制层面的,切忌误以整数层面思考
    return (((((((unsigned int)buffer[0])<<8)|buffer[1])<<8)|buffer[2])<<8)|buffer[3];
}

void main(){
    mac = u8Tou32B(mac_buffer);
    printf("mac - %ld\n ", mac); //1062723756
}
既然能够保存mac地址,我们也可以保存当前时间
//时间戳->十六进制->存储
//1690450650->64C23ADA
unsigned char time_buffer[4] = {0x64, 0xC2, 0x3A, 0xDA};
unsigned int time;

unsigned int u8Tou32B(unsigned char *buffer){
    return (((((((unsigned int)buffer[0])<<8)|buffer[1])<<8)|buffer[2])<<8)|buffer[3];
}
void main(){
    time = u8Tou32B(time_buffer);
    printf("time - %ld s\n", time); // time - 1690450650 s
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【嵌入式学习-C语言篇】 char & short & int 的使用 的相关文章

随机推荐

  • 118.杨辉三角

    一 题目 118 杨辉三角 力扣 LeetCode 二 代码 class Solution public vector
  • 开关电源环路稳定性分析(2)-从开环到闭环

    大家好 这里是大话硬件 在上一节中 基于欧姆定律 基尔霍夫定律 伏秒平衡这些已知的知识点 可以推导出Buck变换器的输入输出关系 今天这一节 我们还是从全局的概念来解析开关电源 1 运放和开关电源 如果一上来就分析开关电源的环路稳定性 我估
  • Spring Boot中集成Redis

    14 1 简介 redis是一款高性能的NOSQL系列的非关系型数据库 14 1 1 非关系型数据库的优势 1 性能NOSQL是基于键值对的 可以想象成表中的主键和值的对应关系 而且不需要经过SQL层的解析 所以性能非常高 2 可扩展性同样
  • 华为三层交换机STP配置

    学习目的 掌握启用和关闭STP的方法 了解不同的STP模式的差异 掌握修改网桥优先级影响根网桥选举的方法 掌握修改端口优先级影响根端口与指定端口选举的方法 掌握配置边缘的方法 拓扑图 场景 你是公司的网络管理员 公司的网络使用了两层网络结构
  • Redis基础--认识redis和对比同类型产品

    一 redis定义与应用 Nosql定义 NoSQL是不同于传统的关系数据库的数据库管理系统的统称 其两者最重要的区别是NoSQL不使用SQL作为查询语言 MySQL定义 MySQL是一种关系型数据库 关系型数据库的一个常见用法是存储长期的
  • 如何大批量压缩图片

    一 ImageMagick ImageMagick 是一个功能强大的命令行图像处理工具 可以用于批量处理图片 它支持各种图像格式和操作 包括压缩和优化 二 使用 ImageMagick 进行大批量压缩指定路径的图片 你可以通过以下步骤实现
  • JavaScript中的内存回收机制

    JS的内存回收 在js中 垃圾回收器每隔一段时间就会找出那些不再使用的数据 并释放其所占用的内存空间 以全局变量和局部变量来说 函数中的局部变量在函数执行结束后这些变量已经不再被需要 所以垃圾回收器会识别并释放它们 而对于全局变量 垃圾回收
  • 宝塔中 nodejs项目 nginx 网站基础/代理设置

    上面是一些基础配置就不写了 吧请求全部代理到 nodejs 项目 location 如果使用pm2等启动node项目 需要加header头 防止读取不到客户端IP proxy set header Host proxy host proxy
  • 生态伙伴

    提到时间管理 想必大多数人的第一反应就是 番茄工作法 番茄工作法是意大利人弗朗西斯科 西里洛于1992年创立的 他和我们大多数人一样 是一个重度拖延症患者 在他大学生活的前几年 曾一度苦于学习效率低下 于是他做了个简单的实验 他找来形状像番
  • JMeter下载及使用

    前言 我是个前端 只是一次偶然的机会被安排用了一次JMeter 做了下步骤记录 所以内容比较基础 想深入研究的兄弟可以再多找找哈 一 下载 官网地址 Apache JMeter Download Apache JMeter 下载zip包 应
  • 计算机网络的软件系统包括哪几部分,系统软件由哪几部分组成?

    系统软件用于实现计算机系统的管理 调度 监视和服务等功能 其目的是方便用户 提高计算机使用效率 扩充系统的功能 通常将系统软件分为以下六类 1 操作系统操作系统是控制和管理计算机各种资源 自动调度用户作业程序 处理各种中断的软件 操作系统的
  • 邮件发送接收原理

    概述 电子邮件是因特网上使用得非常多的一种应用 它可以非常方便的使相隔很远的人进行通信 它主要的特点就是操作简单 快捷 当你发送一封邮件的时候 它首先会发送到收件人的邮件服务器上 并放入收件人的信箱中 如果你在某一个邮件服务器提供商那里申请
  • 建站系列(二)--- 域名、IP地址、URL、端口详解

    目录 相关系列文章 前言 一 IP地址 二 域名与IP地址 三 域名与URL 四 IP地址与端口号 相关系列文章 建站系列 一 网站基本常识 建站系列 二 域名 IP地址 URL 端口详解 建站系列 三 网络协议 建站系列 四 Web服务器
  • Altium Designer 9 学习笔记(二)制作完整的原理图并在此基础上导出PCB版图

    首先 先说下本次练习对象 简单的光敏小夜灯 1 制作原理图 按制图流程 1 1 新建工程及原理图 F N J B 一套连招创建PCB工程 然后右键为新建的工程添加原理图文件 完成后如下图所示 1 2 加载元器件并生成序号 1 2 1 加入电
  • excel转换pdf方法 (aspose.cells亲测有效)

    AsposeUtils java package com lmp test utils import com aspose cells License import com aspose cells PdfSaveOptions impor
  • 北航学长:DCIC 2021的算法方案讲解

    作者 阿水 北京航空航天大学 Datawhale成员 DCIC 作为每年具有重要影响力的政府赛事 除了高认可 高奖金 最重要的是开放了政府和企业的真实数据 具有研究和落地价值 但对于刚参加赛事的同学 还是有难度的 希望通过分享让更初学者也能
  • 网管员牢记10种较为常见服务器管理错误

    网络管理阶层的工作就是保证网络的正常工作 从而使得职工们的工作不被打断 可问题在于事物并非总是按照理想状况发展 事实上经常会出现平地起风波的状况 其间有许多原因 这里我们只讨论10种较为常见的网管错误 1 UPS 不间断电源 的使用问题 某
  • Python+Requests-2-接口自动化脚本实现(虫师-Django接口测试实例)

    编写脚本前分析项目架构 需求 python脚本实现 添加发布会信息 的接口测试 以邮件形式发送测试报告 1 新建一个case目录 存放测试用例 2 新建一个config目录 存放配置信息和读取配置信息 3 新建一个db fixture目录
  • vue项目打包部署到服务器

    目录 一 打包项目 二 修改Nginx的配置 三 部署 四 开放端口号 一 打包项目 1 在 vue config js 文件中找到并修改 主要是publicPath 与outputDir 两项配置 若项目中有baseUrl 替换为publ
  • 【嵌入式学习-C语言篇】 char & short & int 的使用

    嵌入式学习 C语言篇 char short int 的使用 三种数据类型常用场景 智能家居 网关协议中mac地址上报 网关 网关 Gateway 又称网间连接器 协议转换器 网关在传输层以上实现网络互连 是最复杂的网络互连设备 仅用于两个高