计算机对于float型数据类型的读取

一、读float型数据到内存

#include <stdio.h>
int main() {
    float f = 45.125;
    printf("\n");
    return 0;
}
//00 80 34 42
//分析
/*
>>1. 将小数写成 (-1)^S * M * 2^E
45.104 = 45 + 0.125
45(10) ---> 101101(2)
0.125(10) ---> 0.001(2)
45.104(10) ---> 101101.001(2)
45.125 = (-1)^0 * 1.01101001 * 2^5
>>2. 所以计算出 S M E 的值
S = 0
M = 1.01010001
E = 5
>>3. 将 S M E 存入内存中
S ---> 0
M ---> 01010001
E ---> 5 + 127 = 132 --->  10000100
0 10000100 01101001 0000 0000 0000 000
S E        M        补0
0100 0010 0011 0100 1000 0000 0000 0000
0100 0010 0010 1000 1000 0000 0000 0000
>>4. 表示成十六进制为(内存地址从低到高):
00 80 34 42
*/

二、从内存取float型数据

#include <stdio.h>
int main() {
    int a = 10;
    float* pa = (float*) &a;
    //10存到内存的补码表示为:
    //0000 0000 0000 0000 0000 0000 0000 1010 - 补码
    //当使用整型去读的话,可以读出它是 10
    printf("%d\n", a);//10
    //当使用浮点型去读的话,编译器就会认为它是一个浮点型的存储格式,也会使用浮点型的规则来读取
    //0 00000000 00000000000000000001010
    //S = 0   E = 00000000  M = 00000000000000000001010
    //根据 E = 全0 的规则,写出公式格式:
    //(-1)^0 * 0.00000000000000000001010 * 2^(1-127)
    //可见上式是一个无限接近0的数
    //所以编译器会计算出 M 的有效值并且算上精度,即0.000000
    printf("%f\n", *pa);//0.000000
    //当我们存一个浮点型的数据 20.0 进去
    *pa = 20.0;
    //20.0的二进制表示为:10100.0
    //20.0写成规定公式的形式为:
    //(-1)^0 * 1.0100*2^(4)
    //S=0  E=4  M=1.0100
    //存到内存的 S E M分别为:
    //S=0  E=131  M=0100
    //转换成二进制:
    //S=0  E=10000011  M=0100
    //内存中的二进制表示为:
    //0 10000011 0100 0000 0000 0000 0000 000
    //0100 0001 1010 0000 0000 0000 0000 0000
    //如果使用整型去读取,那么编译器就会以整型的存储规则去读取,计算结果是:
    //1101004800
    printf("%d\n", a);//1101004800
    //当使用浮点型去读取浮点型,那没有问题,会使用浮点型的存储规则,可以正确读取20.000000
    printf("%f\n", *pa);//20.000000
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值