• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

C++单、双精度浮点数16进制转10进制原理和代码

武飞扬头像
源客V
帮助1

一、浮点数16进制转10进制原理

浮点数有两种:单精度float(4字节) 和 双精度double(8字节)。

1、单精度结构表

符号位 Sign (S) 指数部分 Exponent (E) 尾数部分 Mantissa (M)
31 30 ~ 23 22 ~ 0
1bit 8bit

23bit

2、双精度结构表

符号位 Sign (S) 指数部分 Exponent (E) 尾数部分 Mantissa (M)
63 62 ~ 52 51 ~ 0
1bit 11bit

52bit

3、浮点数 16进制转10进制原理

公式: 学新通

(1)、 (-1)^S表示符号位,当S=0,V为正,S=1,V为负。

(2)、 M表示有效数字,大于等于1,小于2。.

        单精度 M = 尾数部分十进制 * 2^(-23) 1;

        双精度 M = 尾数部分十进制 * 2^(-52) 1。

(3)、 E表示指数数部分。

        单精度 E = 指数部分十进制 - 127;

        双精度 E = 指数部分十进制 - 1023;

(4)、单精度浮点数16进制转10进制,例(42A54FCC):

十六进制

42 A5 4F CC

二进制 01000010 10100101 01001111 11001100 
符号位(S) 0
指数部分 10000101(十进制:133)
尾数部分 0100101 01001111 11001100(十进制:2445260)
M 计算 M = 2^(-23) * 2445260 1 = 1.291497707366943359
2^E 计算 2^E = 2^(133 - 127) = 2^6 = 64
十进制计算 V V = (-1)^S * M * 2^E = 1 * 1.291497707366943359 * 64
十进制结果 V 82.65585327148437498

        ·双精度浮点数计算方式同理。

二、代码

代码在Qt上编译的,没有Qt可以将QByteArray替换为unsigned  char*类型。

  1.  
    #include <QtCore/QCoreApplication>
  2.  
    #include <QDebug>
  3.  
     
  4.  
    /*单精度浮点数(32位) 16进制转10进制*/
  5.  
    double hex32_10(QByteArray byteDate) {
  6.  
    char* pData = byteDate.data();
  7.  
    //符号位 1
  8.  
    int sign = int(pData[0] >> 7);
  9.  
    //指数位 8
  10.  
    int e = int(((pData[0] & 0x7F) << 1) | ((pData[1] >> 7) & 0x01)) - 127;
  11.  
    //小数位 23
  12.  
    int im = pData[3] & 0xFF;
  13.  
    im |= (pData[2] << 8) & 0xFF00;
  14.  
    im |= (pData[1] << 16) & 0x7F0000;
  15.  
    double m = pow(2, -23) * im 1;
  16.  
    double res = pow(-1, sign) * m * pow(2, e);
  17.  
    qDebug() << byteDate.toHex() << QString::number(res, 'f', 12);
  18.  
    return res;
  19.  
    }
  20.  
     
  21.  
    /*双精度浮点数(64位) 16进制转10进制*/
  22.  
    double hex64_10(QByteArray byteDate) {
  23.  
    char* pData = byteDate.data();
  24.  
    //符号位 1位
  25.  
    int sign = int(pData[0] >> 7);
  26.  
    //指数位 11位
  27.  
    int e = int(((pData[0] & 0x7F) << 4) & 0x0FF0 | (pData[1] & 0xF0) >> 4) - 1023;
  28.  
    //小数位 52位
  29.  
    double m = pow(2, -52) *
  30.  
    (pow(256, 6) * double(pData[1] & 0x0F)
  31.  
    pow(256, 5) * double(pData[2])
  32.  
    pow(256, 4) * double(pData[3])
  33.  
    pow(256, 3) * double(pData[4])
  34.  
    pow(256, 2) * double(pData[5])
  35.  
    256 * double(pData[6])
  36.  
    double(pData[7])) 1;
  37.  
    double res = pow(-1, sign) * m * pow(2, e);
  38.  
    qDebug() << byteDate.toHex() << QString::number(res, 'f', 24);
  39.  
    return res;
  40.  
    }
  41.  
     
  42.  
    int main(int argc, char *argv[])
  43.  
    {
  44.  
    QCoreApplication a(argc, argv);
  45.  
     
  46.  
    QByteArray byteArray_0;
  47.  
    byteArray_0.resize(4);
  48.  
    byteArray_0[0] = 0x42;
  49.  
    byteArray_0[1] = 0xA5;
  50.  
    byteArray_0[2] = 0x4F;
  51.  
    byteArray_0[3] = 0xCC;
  52.  
    hex32_10(byteArray_0);
  53.  
     
  54.  
    QByteArray byteArray;
  55.  
    byteArray.resize(8);
  56.  
    byteArray[0] = 0x42;
  57.  
    byteArray[1] = 0xA5;
  58.  
    byteArray[2] = 0x4F;
  59.  
    byteArray[3] = 0xCC;
  60.  
    byteArray[4] = 0xBB;
  61.  
    byteArray[5] = 0xA8;
  62.  
    byteArray[6] = 0xD2;
  63.  
    byteArray[7] = 0xC5;
  64.  
    hex64_10(byteArray);
  65.  
     
  66.  
    return a.exec();
  67.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghbhkf
系列文章
更多 icon
同类精品
更多 icon
继续加载