C++入门 float内存结构

一、 C++验证float内存模型

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

//unsigned char 转16进制字符串
char hexArray[] = "0123456789ABCDEF";
string getHexString(unsigned char byteDate)
{
    string str("0x");
    str.push_back(hexArray[(byteDate >> 4) & 0x0f]);
    str.push_back(hexArray[byteDate&0x0f]);
    return str;
}


/*
 * float内存结构
 * 1位符号位
 * 8位指数位,指数位偏移127
 * 23位尾数, 23位为小数部分,整数部分的1被隐藏
 */
void printFloatInfo(float floatNum)
{
    cout << "=================================================" << endl;
    unsigned char *pFloat = (unsigned char*)&floatNum;
    int *pInt = (int*)&floatNum;
    cout << "浮点数值:" << floatNum << std::endl;

    cout << "对应内存:";
    for(int i=3;i>=0;i--)
    {
        cout << getHexString(*(pFloat+i))  << " ";
    }
    cout << endl;

    //第一位符号位
    cout << "符号位:";
    cout << ((*(pFloat+3)>>7) & 0x01) << endl;

    //八位指数
    //指数偏移值127,
    cout << "指数部分:";
    int exponent = (*pInt >> 23) & 0xff;
    exponent = exponent - 127;//减去偏移值
    cout << exponent << endl;

    //23位尾数
    cout << "尾数部分:";
    int tail = (*pInt & 0x7fffff) + (1<< 23);
    double tailNum = 0;
    double addNum = 1;
    for(int i=0;i<24;i++)
    {
        if((tail & (1 << 23) )> 0)
        {
            tailNum = tailNum + addNum;
        }

        tail = tail << 1;
        addNum = addNum / 2;
    }

    //考虑指数
    double temp = pow(2,exponent);
    tailNum = tailNum * temp;

    cout << tailNum << endl;
}

//float:7位有效数字
//double:16位有效数字
int main() {
    cout << "分析float内部结构" << std::endl;

    printFloatInfo(1.3);
    printFloatInfo(9.25);
    printFloatInfo(-1.3);
    printFloatInfo(-9.25);
    return 0;
}
/*
输出结果
/home/leon/myfile/project/cpp/clion/cpptest/cmake-build-debug/cpptest
分析float内部结构
=================================================
浮点数值:1.3
对应内存:0x3F 0xA6 0x66 0x66 
符号位:0
指数部分:0
尾数部分:1.3
=================================================
浮点数值:9.25
对应内存:0x41 0x14 0x00 0x00 
符号位:0
指数部分:3
尾数部分:9.25
=================================================
浮点数值:-1.3
对应内存:0xBF 0xA6 0x66 0x66 
符号位:1
指数部分:0
尾数部分:1.3
=================================================
浮点数值:-9.25
对应内存:0xC1 0x14 0x00 0x00 
符号位:1
指数部分:3
尾数部分:9.25

*/

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值