




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 数据类型 C51 中有以下几种数据类型 位型 bit 字符型 char 整型 int 长整型 long 单精浮点型 float 双精浮点型 double 空型 void 指针型 以及结构 struct 和联合 union 下面对其一个个地进行详细讲解 1 位型 bit 位型在内存中占用一个位的空间 例程 include 此程序用于测试位型 此程序用于测试位型 bit void main bit a a 1 a 1 a 0 a 0 a 3 a 1 a 3 a 1 while 1 位型的取值只有两个 0 与 1 就如同 C 中的 bool 型一样 有真与假两种取值 在赋值 的时候如果 右边为非 0 则位型为 1 否则为 0 不要小看这一个位 有的时候可以解决大问题 笔者在项目中用一个位型实现了字节流的 拼 接与解析 问题是这样的 数据发送方将一祯数据分两次发过来 中间有一个时间间隔 接收方在接收 2 到两个子祯的时候 则开始对整祯数据进行解析 怎么判断已经收到一个整祯呢 设置一个位型 初始为0 在接收程序中判断这个位型 如果为0 则继续接收并将这个位型 置为 1 如果为 1 则接收后马上开始解析 完后将其置0 2 char char 型在内存中占用一个字节 8 个位 例程 include 此程序用于测试字符型 此程序用于测试字符型 char void main char a a A a 0 x41a 0b 01000001 a 0 x55 a 0b 01010101 while 1 之所以称为字符型 是因为ASCII 字符码可以由一个字节来表示 如 A 的 ASCII 码为 0 x41 十六进制 41 十进制的 65 这个值就可以赋给一个字节 即一个char 型的变量 当 以字符方式输出时 如使用 printf c 就可以输出一个 A 但其自身只是一个字节 表示的仍是一个数值 当以数值方式输出 如使用printf d 就可以输出一个数值65 在程序中要存储一个字节的数据时 就可以使用char 型 让我们更加深入的来了解char 型 从根本上来认识它 不管它是一个字符 还是一个数值 现在在我们面前的就是内存中的一个字节 一个 byte 8 个位 它的每一个位有自己的权值 从高位到低位 写的时候通常把高位写在前面 3 如 0b 11111111 从左到右 从高位到低位 权值依次为 128 64 32 16 8 4 2 1 计算的时候按照权值来进行计算 如0b 11001100 1 128 1 64 1 8 1 4 204 但是将 0b 11001100 用 printf d 来输出时 输出是 52 为什么不是 204 呢 别 忘了我们用的是 char 型 它是带符号 最高位为符号位 当最高位为 0 时 则数值为正 数值为前 7 位与其权值之积的和 当最高位为 1 时 则数值为负 数值为这个字节按位取反 后 再加 1 当然别忘了添上一个负号 举例 0b 11001100 00110100 1 32 1 16 1 4 52 因为只用到了8个位中的7个来表示数值 所以char的表示范围为 128 127 为什么是 127 因为有个 0 当我们不想表示有符号数的时候 即想用一个字节的 8 个位都表示数值 表示范围为 0 255 则需要在 char 前加上 unsigned 也就是无符号型 其实在上面所述的char 应该加上 signed 有符号型 只是通常情况下省略掉了 加上 unsigned 后 上面的 0b 11001100 输出 时就会输出 204 了 其实把一个字节定义成有符号型还是无符号型 这个字节在内存中的内容都是一样的 只是在数值意义上和输出方式不同时有所区别 3 int 型 int 型在内存中占用两个字节 例程 include 此程序用于测试整型 此程序用于测试整型 int void main 4 int a a 0 x5555 a 0b 0101 0101 0101 0101 while 1 int 占用两个字节 一个字 16 个位 在数值表示上与char 型相类似 每一个位有自身 的权值 亦存在无符号与有符号两种情况 有符号时其表示范围为 32768 32767 无符号 时为 0 65535 这就又出现一个问题 就是当一个int 型的变量赋给一个char 型的变量时 怎么办呢 是这样的 因为 int 型与 char 型长度不匹配 int 型的变量的高字节将被舍弃 这样一个正 的 int 型的变量赋给一个 char 型变量后 char 型变量可能会变成负的 int a char b a 0 x00ff a 0b 0000000011111111 b a b 0b 11111111 printf d b 1 4 long 型 long 型在内存中占用 4 个字节 例程 include 此程序用于测试长整型 此程序用于测试长整型 long void main 5 long a a 0 x55555555 a 0b 0101 0101 0101 01010101 0101 0101 0101 while 1 long 型占用 4 个字节 一个双字 32 个位 有符号型的数值表示范围为 2147483648 2147483647 无符号型为 0 4294967295 在程序的开发中 因为有符号型与无符号型的定义上的错误 可能产生严重的问题 include 此程序用于测试停不下来的此程序用于测试停不下来的for循环循环 void main unsigned char i for i 100 i 0 i 这个程序中有一个 for 循环 循环因子 i 为 unsigned char 型 采用递减方式 由于 i 为无符 号型的 所以 i 永远也不可能小于0 因此这其实是一个死循环 变量的定义 有以下几点需要注意 1 允许在一个类型说明符后 说明多个相同类型的变量 各变量名之间用逗号间隔 类型 说明符与变量名之间至少用一个空格间隔 2 最后一个变量名之后必须以 号结尾 3 变量说明必须放在变量使用之前 一般放在函数体的开头部分 include 6 本程序测试变量连续定义本程序测试变量连续定义 void main unsigned char a b c d e f a 0 b 1 c 2 d 3 e 4 f 5 char int long 难道就是字节长度不同吗 当然有深层的不同 单片机在计算时 需要先将 存储器中的数据读入到寄存器中 51 单片机是 8 位单片机 这就决定了它一次只能从存储 器读取一个字节 那么char 型就只需要一次就可以读到寄存器中了 但int long 型则需要 二次 四次才能读入到寄存器中 因此程序使用不同的数据类型会导致程序运行时间的不 同 这个对于延时函数等与运行时间有关的程序非常重要 include 此程序用于测试不同数据类型实现的此程序用于测试不同数据类型实现的delay函数延时不同的时间函数延时不同的时间 7 void delay char unsigned char time while time void delay int unsigned int time while time void delay long unsigned long time while time void main while 1 5 float 型 float 型在内存中占用 4 个字节的空间 float 型用 4 个字节来表示一个单精度浮点 其遵循一定的编码规则 IEEE 754 标准中 的单精浮点编码 以下详细介绍 Sx 符号位 负数为1 正数为 0 31 bit 30 23 bits 22 0 bits SxExFx 8 Ex 指数 E0 Ex E0 127 Fx 小数部分 尾数 对于一个浮点数 1 若 Ex Fx 为 0 时 浮点数值为 0 1 Sx 2 一般情况下 浮点数值为 1 Sx 1 Fx 2 E0 Ex 3 若Ex为0时 浮点数值为 1 Sx 4 若 Sx Ex Fx 为0时 浮点为非数 NaN Not a Number 单精浮点的数值表示范围为3 4 10 38 3 4 10 38 浮点数均为有符号数 没有无符号 浮点数 曾经遇到过这样的问题 一个浮点数怎么样从一个单片机传到另一个单片机或PC机 有两种传送的方法 1 将浮点通过ftoa函数 ftoa函数在KEIL中是没有的 在配套的程序里提供 转为一 个字符串 然后把字符串中的每一个字符依次发送出去 以下给出ftoa函数的实现 在keil软件的函数中是不提供该函数的 函数名 函数名 ftoa 功能功能 将一个浮点数转为一个精度为 将一个浮点数转为一个精度为jd的字符串 存于的字符串 存于s中中 char ftoa float dat char s unsigned char jd int len temp flag dat0 temp 10 len t len temp 10 48 for i 0 i0 temp 10 i 9 t i temp 10 48 for i 0 i jd i s len t jd i 1 s len 0 x0d s len 0 x0a s len 0 return s 2 直接将单精浮点的4个字节发送出去 问题在于怎么提取浮点所占用的4个字节中的 单个字节 以下给出实现方法 include 演示怎样从浮点中提取字节 演示怎样从浮点中提取字节 void main float a unsigned char g a 1 789 g unsigned char 这样的形式定义变量 在程 序运行期间 这些变量存在于内存的某个单元中 而这个存储单元在内存中的编号 比如内 存容量是 1024 字节 则有 1024 个编号 从 0 1023 当然 在实际的编址时可能不是由0 开始的 这个编号就是存储单元的地址 就像是房子的门牌号一样 用来描述一个地址的 数据类型就是指针 include 此程序用于演示指针此程序用于演示指针 unsigned char a at 0 x08 63 bit 62 52 bits 51 0 bits SxExFx 11 void main unsigned char p unsigned char 0 x08 定义一个指针 给它赋值为定义一个指针 给它赋值为0 x08 指向内存中指向内存中的的 一个单元一个单元 p 0 x01 p表示指针表示指针p所指向的单元内的值 也就是地址为所指向的单元内的值 也就是地址为0 x08的单元的值 把的单元的值 把这这 个单元赋值以个单元赋值以0 x01 变量变量a的地址也为的地址也为0 x08 则不直接给则不直接给a赋值 使用指针间接赋值后 赋值 使用指针间接赋值后 a的值为的值为0 x01 p a 指针指针p赋以赋以a的地址 的地址 符号用以取某一变量的地址 符号用以取某一变量的地址 while 1 在上面的程序中 使用了 at 它可以让编译器将定义的变量固定到相应的内存地址中 去 如果没有 at 的话 编译器则会自动将变量放到某一个地址上去 使用 at 可以使我们 明确一个变量的地址 但如果我们定义不当 有可能会造成数据破坏 在不需要知道变量的 地址时 一般让编译器自动来分配变量 指针用于指向一个单元 那么它所指向的数据是什么类型的呢 既然不知道是什么类 型 的 在读取时怎么来读取呢 别忘了指针是有类型的 如int long 它们指向 int long 等变量的首地址 由自身的类型确定以首地址开始的几个字节 include 此程序用以不同的指针类型 void main unsigned long a unsigned char p1 unsigned char 型指针 12 unsigned int p2 unsigned int 型指针 unsigned long p3 unsigned long 型指针 unsigned char b unsigned int c unsigned long d a 0 x11111111 long 型变量0b 0001 0001 0001 0001 0001 0001 0001 0001 p1 a p1 为 a 的首地址 p2 a p2 为 a 的首地址 p3 a p3 为 a 的首地址 b p1 b 0 x11 c p2 c 0 x1111 d p3 d 0 x11111111 while 1 关于 号的使用方法是这样的 在定义指针型变量时 号用于描述变量类型 即指针类 型 在调用指针所指向的单元内容时 号用于调用该单元 可以向其进行读写 但是如果发定义一个指针 而又不知道它所指向的数据长度时 或者说它所指向的数 据 长度为 0 时 这个指针又该怎么定义呢 这样的情况就要用到void 空指针 了 void 通常 有两种用途 一是明确表示一个函数不返回任何值 二是产生一个同一类型指针 它所指向 的数据长度可以在后面根据需要动态分配内存 include include 此程序用于测试动态分配内存给一个空指针此程序用于测试动态分配内存给一个空指针 void main 13 void xdata p 定义一个指针 它所指向的数据长度未知 定义一个指针 它所指向的数据长度未知 p malloc 100 为为p动态分配内存 动态分配内存 while 1 在实际的开发过程中 指针的使用是很灵活 加之指针的类型转换 可以提高程序的运 行效率 同时也使编程上非常方便 include include 此程序用于测试指针类型转换此程序用于测试指针类型转换 void main void p1 int p2 char p3 float p4 unsigned char i int a1 b1 char a2 b2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内蒙古呼伦贝尔农垦集团有限公司招聘笔试题库及答案详解(名校卷)
- 教师招聘之《小学教师招聘》综合练习附参考答案详解【研优卷】
- 2025年内蒙古呼伦贝尔农垦牙克石莫拐免渡河农牧场有限公司招聘笔试参考题库附答案详解(黄金题型)
- 教师招聘之《幼儿教师招聘》考前冲刺训练试卷附参考答案详解【b卷】
- 教师招聘之《小学教师招聘》考试押题密卷附答案详解【培优b卷】
- 教师招聘之《幼儿教师招聘》考前冲刺练习题及参考答案详解(培优)
- 2025年教师招聘之《小学教师招聘》练习题包含答案详解【培优b卷】
- 2025年教师招聘之《幼儿教师招聘》题库及答案详解(网校专用)
- 2025年教师招聘之《小学教师招聘》题库检测试卷及完整答案详解(典优)
- 教师招聘之《小学教师招聘》检测卷讲解【夺分金卷】附答案详解
- 2025-2030中国汽车钛合金行业市场现状供需分析及投资评估规划分析研究报告
- 2025重庆市綦江区东林街道社区工作者考试真题
- 中国2型糖尿病防治指南(2024版)解读课件
- 《城乡规划管理与法规系列讲座课件-土地利用与建设规范》
- 《思想道德与法治》课件-第一章 领悟人生真谛 把握人生方向
- 2024法律职业资格(客观题)真题含答案
- GB/T 12008.7-2025塑料聚氨酯生产用聚醚多元醇第7部分:碱性物质含量的测定
- 2025年湖南韶山红旅教育培训集团有限公司招聘笔试参考题库附带答案详解
- 大件运输安全生产管理制度文本
- 社区用房使用协议书
- 麻醉术前评估制度
评论
0/150
提交评论