目录
一、数据存储方式
在C语言中提到数据类型或者是定义某个数据,首先想到的就是:
int a=1;
float b=1.2;
......
作为一只只在大一学过C语言基础的菜鸟,以前只知道int是个4个字节的,char是1个字节的,随着STM32的学习慢慢接触了无符号字节,指针,结构体,联合体等。就在今天我接触到了之前从来没想过的数据存储方式了解到自己的知识点不足,写这篇是为了防止忘记以加深学习。
说存储结构之前先了解一下计算机的存储方式,分为大端模式和小端模式。在大端模式下,存储是:数据的高字节存放在内存的低地址中,数据的低字节存在高地址中;小端模式则是:数据的高字节存在高地址中,低字节存在低地址中。
举一个例子,在不同模式下int 类型数据的存放方式:
int a=0x12345678;
内存地址由(高->低) | 3 | 2 | 1 | 0 |
---|---|---|---|---|
小端模式 | 0x12 | 0x34 | 0x56 | 0x78 |
大端模式 | 0x78 | 0x56 | 0x34 | 0x12 |
上表就很好的印证了小端模式下高字节0x12存放在高地址,低字节0x78存放在低地址中,大端模式下高字节0x12存放在低地址中,低字节0x78存放在高地址中。
二、float类型数据存储结构
回过头来看float数据变量,在之前编程时从来没考虑过float的存储结构,只知道如何定义一个浮点类型的数据 float a=1.01;今天偶然间在使用时才注意到这个问题。先看一下float类型数据的存储结构。
名称(分类) | 符号位 | 指数部分 | 小数部分 |
---|---|---|---|
位宽(bit) | 1bit | 8bit | 23bit |
按字节分 | 最高字节的第一位 | 最高字节的七位加上次高字节的第一位 | 剩余部分字节 |
取值范围(n) | 0/1 | 0~255=2^8-1 | 0~8388607=2^23-1 |
计算 | 符号位(+/-) | POW(2,n-127) | 小数部分 |
说明:float数据也是四个字节和int类型类似,对照着上表:
第一部分是符号位,最高位代表的是数值的正负(0代表数值是正数,1代表是负数)
第二部分是指数部分,计算时需要将数值-127,例如指数部分如果是0b0111 1111 代表数值127,在计算时是:2 ^ (127-127) = 2^0,表示指数部分是数值0。如果是0b1000 0000 代表数值128,在计算时是:2 ^ (128-127)=2^1,表示指数部分是数值1。
第三部分是小数部分,例如数值1.1的小数部分是0.1,将十进制的0.1转化为二进制数为: 0.00011001100110011001100…
举例一:小数:2.03
十进制的2.03转化为二进制:10.00000011110101110000101
利用科学计数法表示:1.000000011110101110000101×2^1(注意此时仍为二进制,将小数点移动到第一个1出现为止)
第一部分符号位为0代表正数:0b0
第二部分指数位为1:1+127=128=0b1000 0000
第三部分小数部分照抄上面小数点后面:0b0000 0001 1110 1011 1000 0101
最后将数据重新按字节组合如下表:
注:验证会在在下一章注明
因此,float a=2.03 ,在小端模式的内存为:0x4001EB85(0x40是高字节放在高位,0x85是最低字节放在低位)。
举例二:小数:0.25
十进制的0.25转化为二进制:0.01
利用科学计数法表示:1.0×2^(-2)(注意此时仍为二进制,将小数点移动到第一个1出现为止)
第一部分符号位为0代表正数:0b0
第二部分指数位为-2:(-2)+127=125=0b0111 1101
第三部分小数部分照抄上面小数点后面:0b0000 0000 0000 0000 0000 0000
最后将数据重新按字节组合如下表:
注:验证会在在下一章注明
因此,float a=0.25 ,在小端模式的内存为:0x3E800000(0x3E是高字节放在高位,0x00是最低字节放在低位)。
差不多今天到这明天再写。