提示:个人学习记录,如有错误,欢迎指正
前言
提示:本次主要复习C语言指针时,学习到的相关知识的记录,并第一次尝试以博客的形式记录自己的学习。
一、十进制小数与二进制小数如何相互转化?
十进制===>>二进制
比如 : 有十进制小数:12.345
转化为二进制分成两个部分:
1.整数部分转化
- 对应十进制 12
- 对应二进制 1100
2.小数部分转化
- 对应十进制 0.345
- 需要先乘2 = 0.690 小数点左边为 0
- 还继续乘2 = 1.380 小数点左边为 1
- 还继续乘2 = 0.760 小数点左边为 0
- 还继续乘2 = 1.520 小数点左边为 1
- 还继续乘2 = 1.040 小数点左边为 1
- 还继续乘2 = 0.080 小数点左边为 0
- 还继续乘2 = 0.160 小数点左边为 0
- 还继续乘2 = 0.320 小数点左边为 0
- 还继续乘2 = 0.640 小数点左边为 0
- 还继续乘2 = 1.280 小数点左边为 1
- .........
(以此类推,自上而下取出以上小数点左边的数即可,当乘2后小数部分为0时运算完成,当然有可能会出现不会为0的情况这时就会取一定的精度,所以浮点数类型的数据不是精确值)
- 对应的十进制 0.345
- 对应的二进制 0.0101 1000 0101 0001 1111(这里取了20位)
合并起来就是:1100.0101 1000 0101 0001 1111
对比十进制是:12.345
二进制===>>十进制
整数部分就不再赘述
小数部分:.0101 1000 0101 0001 1111
0*2^(-1) + 1*2^(-2) + 0*2^(-3) + 1*2^(-4) + 1*2^(-5) +.......... = 0.345
最后再组合起来就是12.345
二、计算机内存中如何存储
对于浮点数 有float和double
float类型 C语言中占 4个字节 32位
存储时 1位 符号位(0表示整数,1表示负数)
2-9位 指数位(占8位)
10-32位 尾数(占23位)
共32位
以12.345为例:计算机中的存储为 0100 0001 0100 0101 1000 0101 0001 1111
0 符号位:就表示正数
100 0001 0 指数位:127+n 的二进制形式
下面解释n是什么
12.345的二进制:1100.0101 1000 0101 0001 1111
用科学计数法: 1.10001011000010100011111 * 10^3 其中3就是n
100 0101 1000 0101 0001 1111 尾数:科学计数法小数点后边的数
科学计数法的1.10001011000010100011111 * 10^3 整数位都为1所以尾数只取小数点后边的
存储时 1位 符号位(0表示整数,1表示负数)
2-12位 指数位(占11位)
13-64位 尾数(占52位)
共64位
相比于float只是指数位变成了 1023+n 的二进制形式,类比即可
在C语言中应用一下
#include <stdio.h>
unsigned char AirData[20];
void SendData(const unsigned char *date,unsigned char count) //传一个指针并将其中的值传到AirData[20]
{
unsigned char i;
for(i=0;i<count;i++)
{
AirData[i]=date[i];
}
}
void ReceiveData(unsigned char *date,unsigned char count) //用一个数组或指针看一下传进去了什么值
{
unsigned char i;
for(i=0;i<count;i++)
{
date[i]=AirData[i];
}
}
int main(void)
{
unsigned char i;
float num=12.345;
//内存中 4个字节来存 01000001 01000101 10000101 00011111 小端存储 0X41 45 85 1F 即低位在首地址指向之处
unsigned char *p;
p=#//指针指向num
SendData(p,4);// AirData[0]=0x1F AirData[1]=0x85 AirData[2]=0x45 AirData[3]=0x41 此处体会小端存储
printf("\nAirData= ");
for(i=0;i<20;i++)
{
printf("%x ",AirData[i]);
}
unsigned char DataReceive[4];//DataReceive[4] 接收传入AirData的是什么(当然还是0x1F 0X85 0X45 0X41)
float *souce;
float c;
ReceiveData(DataReceive,4);
souce=(float *)DataReceive;
c=(*souce);
printf("\n%f",c); //c被定义为float所以将会DataReceive[]存储的0x1F 85 45 41数据 以float类型来解码
return 0; //以此可将复杂格式的数据转化为字节,方便通信和存储
}