c语⾔四字节转浮点数_C语⾔基础⼤放送
⼀、简述
对于C语⾔基础相关⽅⾯的表⾯理解,简单介绍。
⼆、⼆进制
⽣活中常⽤的是⼗进制,基数0,1,2,3,4,5,6,7,8,9,。满10进1。
时钟60进制。基数0,57,58,59。满60进1。60秒为1分钟,60分钟为1⼩时。
计算机⼆进制,基数0,1。满2进1。⾼电平代表1,低电平代表0。计算机的指令和数据都是⽤0和1来表⽰的。
三、计算机部分组成
CPU+内存+外存。
CPU执⾏指令,CPU包括运算器、控制器。(包括多个寄存器)运算器负责逻辑运算,控制器包括对数据和指令的存取操作。
内存运⾏当前的程序(代码+数据),(代码可以看做是⼀系列的指令)内存可以划分为很多个单元,每个单元⼀个字节并对应⼀个编号,这个编号称为地址。(断电了就数据没了)
外存可以简单认为是硬盘。(存放数据、应⽤程序等,断电了数据还在)
程序运⾏:程序放在硬盘,CPU将读取到内存,然后逐条执⾏指令。
多任务:有多个程序在同时运⾏,但是只有⼀个CPU,采⽤时间⽚轮询⽅式,简单来说,假设A,B,C三个程序同时执⾏,CPU执⾏A程序的⼀条指令,然后再执⾏B程序的⼀条指令,再执⾏C程序的⼀条指令,再到A。CPU执⾏得很快,看起来是同时执⾏的。当然任务之间还有优先级。
断电数据丢失:在内存中的数据都是⽤电来表⽰的,断电之后,这些数据就会丢失。
虚拟内存:操作系统为了更好、更⾼效地使⽤内存,管理内存,将实际物理内存进⾏了映射,对应⽤程序屏蔽了物理内存的细节,有利简化程序的编写。假设物理内存只有1G,有三个应⽤程序同时在运⾏,
系统会将物理内存的⼀部分映射为3个⼤⼩均为4G的虚拟内存,让每⼀个应⽤程序都以为⾃⼰拥有4G内存(实际并不是,虚拟内存经过⼀定的⽅式映射为物理内存),这样极⼤地⽅便了应⽤程序的数据和代码的组织。
内存4区:栈区,堆区,全局区,代码区。
总线:计算机各部分通过总线连接。包括地址总线,数据总线,控制总线。地址总线:⽐如有32根地址总线,每⼀根线有⾼电平1,低电平两种状态0,那么可以表⽰0x00000000~0xFFFFFFFF总共2的32次⽅这么多个地址,⼀个地址可以表⽰⼀个内存单元。⼀般来说,地址总线越多,可以表⽰的地址越多。指针变量就是存放地址的,⽐如:int i = 10; int *p = &i;若i的地址为0x00800400;那么p指针变量存放
的值就是0x00800400,是⼀个有实际地址意义的整数。因为是32根地址总线,所以sizeof(p) = 4 (字节)。数据总线:⽐如有8根数据线,那么同时可以存取8位数据,⼀般来说数据总线越多,同时存取的数据越多,执⾏效率越⾼。控制总线:控制、协调计算机各部分⼯作,存取指令。⼀般来说总线还可以拓展。
四、变量
内存分为⼀个⼀个单元,⼀个单元⼀个字节,并且⼀个单元对应⼀个地址编号。
在汇编语⾔中,可以直接对内存地址进⾏操作,如:MOV AL,[2000H] ;将内存地址0x2000的内容送到AL寄存器中。
汇编中,直接将数据存放到某个内存地址,如将学⽣学号放到某个地址,学⽣姓名放到某个地址。到时候读取的时候,直接读取某个地址。这样⼦固然程序执⾏效率⾼,但是如果数据⼀多,难免会记不住哪个数据对应哪个地址,看到⼀个地址,⾃⼰还得想⼀下之前这个地址(这⼀段内存)存放的是什么数据,写起代码也不⽅便。时间⼀长,就算是⾃⼰编写的代码都要花很多时间才能看懂,⽽且维护起来也⽐较⿇烦。
这样我们将数据对应的⼀段内存起⼀个名字,这个名字就代表着⼀⽚内存,到时候直接操作着个名字就
相当于操作这⼀⽚内存,这个名字就是我们所说的变量。起⼀个与数据相关的有意义的名字,⽅便我们编程。如:C语⾔中,我们可以将存放学⽣学号的那⼀段内存叫做id,将存放学⽣姓名的那⼀段内存叫做name。这样我们就可以通过id,name这两个变量名类读取或存储学⽣的id信息和姓名信息,到时候我们⼀看变量名name,我们就能想到这是存放姓名信息的。
变量:对应⼀⽚内存,内存可以存放不同的数据,变量,变化的量。变量的地址就是对应的那⼀⽚内存⾸地址。如果变量占据多个内存单元,⾸个内存单元的地址就是变量的地址。程序中定义⼀个变量就在内存中开辟⼀⽚内存空间(系统为程序分配⼀⽚内存空间,如int i = 0;在32位系统中,系统会分配4字节的内存空间,在单⽚机中就可能是在RAM中分配2字节(16位) )。
五、数据类型
为了⽅便,或者是为了执⾏效率,计算机采⽤了⼆进制,通过低电平或断电状态表⽰0,通过 通电或⾼电平状态表⽰1。这样⼀来,计算机只认识0和1,也只能表⽰0和1。那么我需要表⽰其他数字:2,3,4....字符:a,怎么办?我们可以使⽤多个0和1来代表其他数字和字符,并统⼀为⼀个表。
(00110000)
数字000110001
数字100110010
数字2 (01000100)
⼤写字母D0*******
⼤写字母E................
在内存中,表达整数0我们可以⽤ 00110000,表达整数4亿我们可以⽤ 00111111100011000011110。
上⾯这样⼦表⽰,我们可以知道这⼀段的0和1表⽰这整数0,那⼀段0和1表⽰4亿,但是实际上我们“看”不到内存,我们不知道从这个位
置开始,到哪⾥结束表⽰着⼀个数据。我们需要明确规定多少个0和1表⽰⼀个整数,假设我们约定8位0和1表⽰⼀个整数,这样我们知道
了内存⾸地址,往后读取8个0和1然后就可以读取到⼀个数据(整数)。就像加密的电报⼀样,"滴滴"表⽰1,“滴”表⽰0。按照多少个0和
1代表⼀个字,才能正确的解密。
所以我们需要指定多少个0和1来表⽰⼀个数据。8个0和1可以表⽰2的8次⽅==〉256个数。要是有正负值,表⽰范围为-128-127。⽐如
在32位系统中,C语⾔的整型int⽤32位即4字节表⽰,可以表⽰2的32次⽅==〉4294967296个数,有符号的表⽰范围为-2147483648——2147483647。有⼀些数据范围不⼤,只需⼏⼗个,如果⽤32位表⽰⼀个数据就显得浪费内存。有⼀些数据范围很
⼤,⽤32位表⽰⼜不够表⽰,于是就有16位的short类型,64位的long long类型(不同的系统有可能类型的位数不⼀样)。就像⽤盒⼦打包
物品⼀样,有⼀些物品⽐较⼩,有⼀些物品⽐较⼤。要是统⼀⽤⼀种尺⼨的盒⼦装,盒⼦过⼩,⼤的物品⼜装不下,盒⼦过⼤,⽤来装⼩的
有显得有点浪费,于是多种尺⼨的盒⼦就产⽣了-多种数据类型。还有⼀个原因:就是在表达⼩数,或者是⾮常⼤的数时就算是64位也有点
⽆能为⼒,但是如果改变存储⽅式,同样是64位,却可以表⽰更⼤范围的数。于是有了新的数据存储⽅式,这是针对浮点数的。(如果将整
数和浮点数采⽤同样的存储⽅式,计算机结构会更加复杂化,甚⾄会降低执⾏效率)
数据的⼤⼩范围不⼀,整数,浮点数的存储⽅式不⼀样(读取的时候解析的⽅式也不⼀样),为了合理利⽤内存,提⾼执⾏效率,⽅便开发等
原因,我们需要不同的数据类型。
不同的数据类型意味着数据的⼤⼩不同(多少位0和1表⽰⼀个数据,也就是这种数据类型占多少个字节),数据的存储⽅式(数据的解析⽅式)
不同。也就是说同⼀个内存⾸地址,按照不同的数据类型,即按照不同的位数解读内存数据,就会读取
出不⼀样的数据,按照不同的解析⽅
式,也会读取出不⼀样的数据。就像加密电报⼀样,按照不同的位数⼀样的译码表也会解读出不⼀样的译⽂,按照⼀样的位数不⼀样的译码
表也会解读出不⼀样的数据。如果仅仅知道数据的地址,不知道数据类型(包含数据⼤⼩、数据的解析⽅式),是⽆法正确解读数据的。如有
⼀数据的⾸地址是0x0F48000,从这个地址开始存储着:1010001101010111010001010000101110100011101101001000010101010000010100110000101001001001011010
不知道数据类型,那么到哪⾥结束才是整个数据?就算知道了到哪⾥结束,⼜该怎么解析?(要知道还有⽤户构造类型--结构体类型)。因
此,⽤地址操作数据 需要配合数据类型。
定义不同数据类型的变量,系统根据数据类型分配相应的内存⼤⼩,程序填充数据时根据相应的存储⽅式,读取数据时按照相应的⽅式解析,不然读取不到正确的数据。如float类型的数据,如果直接按照int
类型数据读取,那么读取出来的不是正确的数据。如float类型的数据12.0,如果按照int类型数据解读,就得不到我们"期望"的12。
int类型存放整数,char类型存放字符,float类型存放浮点数,那么有没有⼀种变量是存放地址的呢?当然有--指针。
在32位系统环境,⼀般来说指针变量⼤⼩就是32位(4字节),那么为什么还有指针的数据类型呢?因为我们知道⼀个内存⾸地址以及数据⼤⼩,还需要确定怎么解析数据,类型就是⽤来指⽰解析/存储数据的。
六、修改内存数据
对于程序⾃⼰申请的内存,作为拥有者,可以对这⼀⽚内存进⾏读取或修改数据,其他程序⼀般没有权限读取或修改。但是可以通过⼀些⽅式可以进⾏修改。
汇编语言转c语言的软件
七、发展历史,应⽤场景,编译器
对于发展历史,就有必要提及兼容性,和各种名词的由来。
有时候我们会有这种疑惑,为什么这样⼦设计,为什么不能简单⼀点呢?
有可能是为了兼容以前的版本,或者是预留拓展接⼝。
有时候我们会有这种疑惑,为什这样⼦命名?⼀点都不形象。
有可能是它原来就很形象的,只是它被改进了。就像刚接触电脑时,感慨电脑的功能真是强⼤,不愧"电脑"之称。
为什么会被叫做计算机呢?因为它本来最初设计的时候,它就是⼀台只会计算的机器。(原理上,它的核⼼也只会计算)
了解⼀样东西的发展过程,或者说了解⼀样东西的创造过程、改进过程。
可以拓展我们的思维,可能在以后的创造和设计中不知不觉的就进⾏模仿,参照⽐较。
关于应⽤场景,就有必要谈及优缺点,有优势才有"前途"。
(也许是意外的"接触"到C语⾔,但是如果想要深⼊学习的话,就有必要了解它究竟能"做什么")
编译器:将我们编辑的代码翻译为计算机所"认识"的机器代码。
(这个机器代码:或者说计算机指令,可以简单认为是我们预定义的动作代号)
有时候编译器不会听话,不会按照我们的代码⼀成不变的"翻译",它还会"做⼿脚"。
⽐如有⼀些编译器会对代码进⾏优化,如:
int i; int j; for(i=0; i<200; i++) { for(j=0; j<102; j++); }
编译器发现循环⾥⾯什么都没做,它就会将这⼀段代码,去掉,
然后再发现,i,j都没有使⽤,⼜将定义i,j的语句去掉。
有时候,我们就是想通过这样来实现⼀定的延时呢?
别担⼼,⼀般的编译器不会默认优化,⽽且可以设置是否优化以及优化的级别。
编译器会帮我们分析词法、语法。不同的版本有差异,或者说它⽀持的标准不同。
如C99标准的⽀持如下格式:
for(int i=0; i<200; i++) {}
C89就不⽀持了。
编译器参照的标准不⼀样,写法就可能存在差异。
平台的差异(Windows, ),写法就可能存在差异。
⼋、待整理待补充
1、码(ASCII码,原码,反码,补码。。。)字符、负数的存储⽅式。
2、基本数据类型(char, int, float, double, long。。。)了解其⼤⼩,存储/解析⽅式,数值的表⽰范内存对齐:为了提⾼CPU的访问效率(存取数据的速度),编译器会对数据进⾏字节对齐。
地址线、数据线的条数决定CPU⼀次最⼤能够同时存取访问多少字节的数据。
在32位机器中,CPU⼀次最⼤能够同时存取访问32位(4字节)数据,⼀般数据都⼤于4字节,为了加快CPU存取效率,
CPU每次都取4字节(⽆论数据有没有4字节,CPU都会取出来4字节)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。