二进制与字节单位,以及常用三种变量的取值范围
2018-01-19 09:31
351 查看
【14.1 为什么要二进制?】
为什么要二进制?我们日常生活明明是十进制的,为何数字电子领域偏要选择二进制?这是由数字硬件电路决定的。人有十个手指头,人可以直接发出十种不同声音来命名0,1,2,3...9这些数字,人可以直接用眼睛识别出十种不同状态的信息,但是数字底层基础硬件电路要直接处理和识别十种状态却很难,相对来说,处理和识别两种状态就轻松多了,所以选择二进制。比如,一颗LED灯的亮或灭,一个IO口的输出高电平或低电平,识别某一个点的电压是高电平或低电平,只需要三极管等基础元器件就可把硬件处理电路搭建起来,二进制广泛应用在数字电路的存储,通讯和运算等领域,想学好单片机就必须掌握它。
【14.2 二进制如何表示成千上万的大数值?】
二进制如何表示成千上万的数值?现在用LED灯的亮和灭来跟大家讲解。
(1)1个LED灯:
灭 第0种状态
亮 第1种状态
合计:共2种状态。
(2)2个LED灯挨着:
灭灭 第0种状态
灭亮 第1种状态
亮灭 第2种状态
亮亮 第3种状态
合计:共4种状态。
(3)3个LED灯挨着:
灭灭灭 第0种状态
灭灭亮 第1种状态
灭亮灭 第2种状态
灭亮亮 第3种状态
亮灭灭 第4种状态
亮灭亮 第5种状态
亮亮灭 第6种状态
亮亮亮 第7种状态
合计:共8种状态。
(4)8个LED灯挨着:
灭灭灭灭灭灭灭灭 第0种状态
灭灭灭灭灭灭灭亮 第1种状态
...... 第N种状态
亮亮亮亮亮亮亮灭 第254种状态
亮亮亮亮亮亮亮亮 第255种状态
合计:共256种状态。
(5)16个LED灯挨着:
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭 第0种状态
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭亮 第1种状态
...... 第N种状态
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮灭 第65534种状态
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮 第65535种状态
合计:共65536种状态。
(6)32个LED灯挨着:
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭 第0种状态
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭亮 第1种状态
...... 第N种状态
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮灭 第4294967294种状态
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮 第4294967295种状态
合计:共4294967296种状态。
结论:
连续挨着的LED灯越多,能表达的数值范围就越大。
【14.3 什么是位?】
什么是位?以上一个LED灯就代表1位,8个LED灯就代表8位。位的英文名是用bit来表示。一个变量的位数越大就意味着这个变量的取值范围越大。一个单片机的位数越大,就说明这个单片机一次处理的数据范围就越大,意味着运算和处理速度就越快。我们日常所说的8位单片机,32位单片机,就是这个位的概念。为什么32位的单片机比8位单片机的处理和运算能力强,就是这个原因。
【14.4 什么是字节?】
什么是字节?字节是计算机很重要的一个基本单位,一个字节有8位。8个LED灯挨着能代表多少种状态,就意味着一个字节的数据范围有多大。从上面举的例子中,我们知道8个LED灯挨着,能表示从0到255种状态,所以一个字节的取值范围就是从0到255。
【14.5 三种常用变量的取值范围是什么?】
前面章节曾提到三种常用的变量:unsigned char,unsigned int ,unsigned long。现在有了二进制和字节的基础知识,就可以跟大家讲讲这三种变量的取值范围,而且很重要,这是我们写单片机程序必备的概念。
unsigned char的变量占用1个字节RAM,共8位,根据前面LED灯的例子,取值范围是从0到255。
unsigned int的变量占用2个字节RAM,共16位,根据前面LED灯的例子,取值范围是从0到65535。多说一句,对于51内核的单片机,unsigned int的变量是占用2个字节。如果是在32位的stm32单片机,unsigned int的变量是占用4个字节的,所以不同的单片机不同的编译器是会有一些差异的。
unsigned long的变量占用4个字节RAM,共32位,根据前面LED灯的例子,取值范围是从0到4294967295。
【14.6 例程练习和分析。】
现在我们编写一个程序来验证unsigned char,unsigned int,unsigned long的取值范围。
定义两个unsigned char变量a和b,a赋值255,b赋值256,255和256恰好处于unsigned char的取值边界。
再定义两个unsigned int变量c和d,c赋值65535,d赋值65536,65535和65536恰好处于unsigned int的取值边界。
最后定义两个unsigned long变量e和f,e赋值4294967295,f赋值4294967296,4294967295和4294967296恰好处于unsigned long的取值边界。
程序代码如下:
/*---C语言学习区域的开始。-----------------------------------------------*/
void main() //主函数
{
unsigned char a; //定义一个变量a,并且分配了1个字节的RAM空间。
unsigned char b; //定义一个变量b,并且分配了1个字节的RAM空间。
unsigned int c; //定义一个变量c,并且分配了2个字节的RAM空间。
unsigned int d; //定义一个变量d,并且分配了2个字节的RAM空间。
unsigned long e; //定义一个变量e,并且分配了4个字节的RAM空间。
unsigned long f; //定义一个变量f,并且分配了4个字节的RAM空间。
a=255; //把255赋值给变量a,a此时会是什么数?会超范围溢出吗?
b=256; //把256赋值给变量b,b此时会是什么数?会超范围溢出吗?
c=65535; //把65535赋值给变量c,c此时会是什么数?会超范围溢出吗?
d=65536; //把65536赋值给变量d,d此时会是什么数?会超范围溢出吗?
e=4294967295; //把4294967295赋值给变量e,e此时会是什么数?会超范围溢出吗?
f=4294967296; //把4294967296赋值给变量f,f此时会是什么数?会超范围溢出吗?
View(a); //把第1个数a发送到电脑端的串口助手软件上观察。
View(b); //把第2个数b发送到电脑端的串口助手软件上观察。
View(c); //把第3个数c发送到电脑端的串口助手软件上观察。
View(d); //把第4个数d发送到电脑端的串口助手软件上观察。
View(e); //把第5个数e发送到电脑端的串口助手软件上观察。
View(f); //把第6个数f发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第1个数
十进制:255
十六进制:FF
二进制:11111111
第2个数
十进制:0
十六进制:0
二进制:0
第3个数
十进制:65535
十六进制:FFFF
二进制:1111111111111111
第4个数
十进制:0
十六进制:0
二进制:0
第5个数
十进制:4294967295
十六进制:FFFFFFFF
二进制:11111111111111111111111111111111
第6个数
十进制:0
十六进制:0
二进制:0
分析:
通过实验结果,我们知道unsigned char变量最大能取值到255,如果非要赋值256就会超出范围溢出后变成了0。unsigned int变量最大能取值到65535,如果非要赋值65536就会超出范围溢出后变成了0。unsigned long变量最大能取值到4294967295,如果非要赋值4294967296就会超出范围溢出后变成了0。
【14.7 如何在单片机上练习本章节C语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。
为什么要二进制?我们日常生活明明是十进制的,为何数字电子领域偏要选择二进制?这是由数字硬件电路决定的。人有十个手指头,人可以直接发出十种不同声音来命名0,1,2,3...9这些数字,人可以直接用眼睛识别出十种不同状态的信息,但是数字底层基础硬件电路要直接处理和识别十种状态却很难,相对来说,处理和识别两种状态就轻松多了,所以选择二进制。比如,一颗LED灯的亮或灭,一个IO口的输出高电平或低电平,识别某一个点的电压是高电平或低电平,只需要三极管等基础元器件就可把硬件处理电路搭建起来,二进制广泛应用在数字电路的存储,通讯和运算等领域,想学好单片机就必须掌握它。
【14.2 二进制如何表示成千上万的大数值?】
二进制如何表示成千上万的数值?现在用LED灯的亮和灭来跟大家讲解。
(1)1个LED灯:
灭 第0种状态
亮 第1种状态
合计:共2种状态。
(2)2个LED灯挨着:
灭灭 第0种状态
灭亮 第1种状态
亮灭 第2种状态
亮亮 第3种状态
合计:共4种状态。
(3)3个LED灯挨着:
灭灭灭 第0种状态
灭灭亮 第1种状态
灭亮灭 第2种状态
灭亮亮 第3种状态
亮灭灭 第4种状态
亮灭亮 第5种状态
亮亮灭 第6种状态
亮亮亮 第7种状态
合计:共8种状态。
(4)8个LED灯挨着:
灭灭灭灭灭灭灭灭 第0种状态
灭灭灭灭灭灭灭亮 第1种状态
...... 第N种状态
亮亮亮亮亮亮亮灭 第254种状态
亮亮亮亮亮亮亮亮 第255种状态
合计:共256种状态。
(5)16个LED灯挨着:
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭 第0种状态
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭亮 第1种状态
...... 第N种状态
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮灭 第65534种状态
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮 第65535种状态
合计:共65536种状态。
(6)32个LED灯挨着:
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭 第0种状态
灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭灭亮 第1种状态
...... 第N种状态
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮灭 第4294967294种状态
亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮亮 第4294967295种状态
合计:共4294967296种状态。
结论:
连续挨着的LED灯越多,能表达的数值范围就越大。
【14.3 什么是位?】
什么是位?以上一个LED灯就代表1位,8个LED灯就代表8位。位的英文名是用bit来表示。一个变量的位数越大就意味着这个变量的取值范围越大。一个单片机的位数越大,就说明这个单片机一次处理的数据范围就越大,意味着运算和处理速度就越快。我们日常所说的8位单片机,32位单片机,就是这个位的概念。为什么32位的单片机比8位单片机的处理和运算能力强,就是这个原因。
【14.4 什么是字节?】
什么是字节?字节是计算机很重要的一个基本单位,一个字节有8位。8个LED灯挨着能代表多少种状态,就意味着一个字节的数据范围有多大。从上面举的例子中,我们知道8个LED灯挨着,能表示从0到255种状态,所以一个字节的取值范围就是从0到255。
【14.5 三种常用变量的取值范围是什么?】
前面章节曾提到三种常用的变量:unsigned char,unsigned int ,unsigned long。现在有了二进制和字节的基础知识,就可以跟大家讲讲这三种变量的取值范围,而且很重要,这是我们写单片机程序必备的概念。
unsigned char的变量占用1个字节RAM,共8位,根据前面LED灯的例子,取值范围是从0到255。
unsigned int的变量占用2个字节RAM,共16位,根据前面LED灯的例子,取值范围是从0到65535。多说一句,对于51内核的单片机,unsigned int的变量是占用2个字节。如果是在32位的stm32单片机,unsigned int的变量是占用4个字节的,所以不同的单片机不同的编译器是会有一些差异的。
unsigned long的变量占用4个字节RAM,共32位,根据前面LED灯的例子,取值范围是从0到4294967295。
【14.6 例程练习和分析。】
现在我们编写一个程序来验证unsigned char,unsigned int,unsigned long的取值范围。
定义两个unsigned char变量a和b,a赋值255,b赋值256,255和256恰好处于unsigned char的取值边界。
再定义两个unsigned int变量c和d,c赋值65535,d赋值65536,65535和65536恰好处于unsigned int的取值边界。
最后定义两个unsigned long变量e和f,e赋值4294967295,f赋值4294967296,4294967295和4294967296恰好处于unsigned long的取值边界。
程序代码如下:
/*---C语言学习区域的开始。-----------------------------------------------*/
void main() //主函数
{
unsigned char a; //定义一个变量a,并且分配了1个字节的RAM空间。
unsigned char b; //定义一个变量b,并且分配了1个字节的RAM空间。
unsigned int c; //定义一个变量c,并且分配了2个字节的RAM空间。
unsigned int d; //定义一个变量d,并且分配了2个字节的RAM空间。
unsigned long e; //定义一个变量e,并且分配了4个字节的RAM空间。
unsigned long f; //定义一个变量f,并且分配了4个字节的RAM空间。
a=255; //把255赋值给变量a,a此时会是什么数?会超范围溢出吗?
b=256; //把256赋值给变量b,b此时会是什么数?会超范围溢出吗?
c=65535; //把65535赋值给变量c,c此时会是什么数?会超范围溢出吗?
d=65536; //把65536赋值给变量d,d此时会是什么数?会超范围溢出吗?
e=4294967295; //把4294967295赋值给变量e,e此时会是什么数?会超范围溢出吗?
f=4294967296; //把4294967296赋值给变量f,f此时会是什么数?会超范围溢出吗?
View(a); //把第1个数a发送到电脑端的串口助手软件上观察。
View(b); //把第2个数b发送到电脑端的串口助手软件上观察。
View(c); //把第3个数c发送到电脑端的串口助手软件上观察。
View(d); //把第4个数d发送到电脑端的串口助手软件上观察。
View(e); //把第5个数e发送到电脑端的串口助手软件上观察。
View(f); //把第6个数f发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
第1个数
十进制:255
十六进制:FF
二进制:11111111
第2个数
十进制:0
十六进制:0
二进制:0
第3个数
十进制:65535
十六进制:FFFF
二进制:1111111111111111
第4个数
十进制:0
十六进制:0
二进制:0
第5个数
十进制:4294967295
十六进制:FFFFFFFF
二进制:11111111111111111111111111111111
第6个数
十进制:0
十六进制:0
二进制:0
分析:
通过实验结果,我们知道unsigned char变量最大能取值到255,如果非要赋值256就会超出范围溢出后变成了0。unsigned int变量最大能取值到65535,如果非要赋值65536就会超出范围溢出后变成了0。unsigned long变量最大能取值到4294967295,如果非要赋值4294967296就会超出范围溢出后变成了0。
【14.7 如何在单片机上练习本章节C语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改“C语言学习区域”的代码就可以了,其它部分的代码不要动。编译后,把程序下载进带串口的51学习板,通过电脑端的串口助手软件就可以观察到不同的变量数值,详细方法请看第十一节内容。
相关文章推荐
- 关于为什么电脑32位系统在处理数据时是4个字节的二进制数据以及byte取值范围的考虑?
- byte short: 变量字节大小及有效范围取值
- 练习2-1 编写一个程序一确定分别由signed及unsigned限定的char,short,int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现。通过直接计算来确定浮点类型的取值范围是一项难度很大的任务。
- 编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现
- byte short: 变量字节大小及有效范围取值
- C语言笔记:变量字节长度&取值范围——sizeof()VS strlen
- Day01 - Xcode常用快捷键、高级语言源码的编译到运行、三码运算、基础类型所占字节与取值范围
- Java中变量所占字节大小及有效取值范围
- Linux环境下设置环境变量的三种常用方法(转帖)
- 动态生成数组,随机生成一定范围的随机数,三种常用排序算法
- 【C】各种数据类型的取值范围(常用)
- 对于一个字节(8bits)的变量,求其二进制表示中“1”的个数
- servlet(三)-如何使用传参-三种转发方式、传递参数以及对象中数据的范围
- 线程高级应用-心得3-线程范围内的共享变量以及应用场景及面试题案例分析
- CRecordset类的常用成员函数 成员变量 以及操作实例
- 练习 2-1 编写一个程序以确定分别由 signed 及 unsigned 限定的 char、short、 int 与 long 类型变量的取值范围。
- C语言各种数据类型及其在系统中占的字节和取值范围
- 计算char,short,int,long类型变量的取值范围
- [置顶] Objective-C基本数据类型取值范围、字节
- 打印分别由signed和unsigned限定的char , short, int ,与long类型变量的取值范围。