C#关于32位浮点数Float(Real)一步步按位Bit进行解析 您所在的位置:网站首页 32位代表什么意思 C#关于32位浮点数Float(Real)一步步按位Bit进行解析

C#关于32位浮点数Float(Real)一步步按位Bit进行解析

2023-08-26 01:41| 来源: 网络整理| 查看: 265

我们都知道单精度浮点数(Single,float,Real)由32位0或1组成,它具体是如何来的。

浮点数的32位N=1符号位(Sign)+8指数位(Exponent)+23尾数部分(Mantissa)

符号位(Sign) : 0代表正,1代表为负【占1位】 指数位(Exponent)::用于存储科学计数法中的指数数据,并且采用移位存储【占8位】 尾数部分(Mantissa):尾数部分【占23位】 单精度float:N共32位,其中S占1位,E占8位,M占23位。因此小数点后最多精确到23/4=6位 。

一、C#代码示例如下:

using System; using System.Collections.Generic; using System.Linq;

namespace ConverterAndPrecisionDemo {     class Program     {         static void Main(string[] args)         {             //参考博客:https://blog.csdn.net/zhengyanan815/article/details/78550073             //小数点后面:4个位占用一个数字【十进制9就是1001】             //符号位(Sign) : 0代表正,1代表为负【占1位】             //指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储【占8位】             //尾数部分(Mantissa):尾数部分【占23位】             //单精度float:N共32位,其中S占1位,E占8位,M占23位。因此小数点后最多精确到23/4=6位              //双精度double:N共32位,其中S占1位,E占11位,M占52位。因此小数点后最多精确到52/4=13位              //十进制小数的二进制表示:【法则--整数部分:除基取余,逆序拼接。小数部分:乘基取整,顺序拼接】             //整数部分:除以2,取出余数,商继续除以2,直到得到0为止,将取出的余数逆序。可以使用栈Stack             //小数部分:乘以2,然后取出整数部分,将剩下的小数部分继续乘以2,然后再取整数部分,一直取到小数部分为零为止。如果永远不为零,则按要求保留足够位数的小数,最后一位做0舍1入。将取出的整数顺序排列。可以使用队列Queue             float f = 123456.8125F;             byte[] buffer = BitConverter.GetBytes(f);             Console.WriteLine("打印浮点数对应的4个字节:");             Console.WriteLine(string.Join(",", buffer));

            Console.WriteLine($"【使用函数】{123456}对应的二进制:{ Convert.ToString(123456, 2)}");             int num = 123456;             Stack stack = new Stack();             while (num != 0)             {                 int cur = num % 2;                 stack.Push(cur);                 num = num / 2;             }             Console.WriteLine($"【使用堆栈】{123456}对应的二进制:{ string.Join("", stack)}");             int scale = 10;             int index = 0;             double d = 0.8125;             Queue queue = new Queue();             while (index < scale)             {                 int cur = (int)(d * 2);                 queue.Enqueue(cur);                 d = d * 2 - cur;                 if (d == 0)                 {                     break;                 }                 index++;             }             Console.WriteLine($"{0.8125}对应的二进制:{ string.Join("", queue)}");             string binaryDisplay = string.Join("", stack) + "." + string.Join("", queue);             Console.WriteLine($"{123456.8125}对应的二进制为{binaryDisplay}");             int dotIndex = binaryDisplay.IndexOf('.');             //移除小数点后将小数点插入索引1的位置【即:小数点移动到索引1的位置】             string scienceDisplay = binaryDisplay.Remove(dotIndex, 1).Insert(1, ".");             Console.WriteLine($"小数{123456.8125}对应的二进制科学计数为{scienceDisplay}×(2的{dotIndex - 1}次方)");             string sign = (f > 0 ? "0" : "1");//符号位占用1位             Console.WriteLine($"符号位S:正数为0,负数为1。符号位是:{sign}");             string exponent = Convert.ToString(127 + (dotIndex - 1), 2).PadLeft(8, '0');//指数位占用8位             Console.WriteLine($"指数位E:123456最高位为2的{dotIndex - 1}次方,指数为{dotIndex - 1},因此指数位E的十进制值为【127+{dotIndex - 1}={127 + dotIndex - 1}】");             //尾数部分:去除scienceDisplay开始的"1.",也就是字符串从索引2开始。并凑够23位             string mantissa = scienceDisplay.Substring(2).PadRight(23, '0');//尾数位占用23位             Console.WriteLine($"尾数位M:尾数部分M需要凑够23位。为【{mantissa}】");             string joinBits = sign + exponent + mantissa;//符号位占用1位+指数位占用8位+尾数位占用23位=32位             byte[] bufferJoin = new byte[4];             for (int i = 0; i < 4; i++)             {                 bufferJoin[i] = Convert.ToByte(joinBits.Substring(8 * i, 8), 2);             }             Console.WriteLine("重新拼接形成的32位浮点数,对应的4个字节为:");             Console.WriteLine(string.Join(",", bufferJoin));             byte[] reverseBuffer = bufferJoin.Reverse().ToArray();             Console.WriteLine("反转数组bufferJoin的顺序:重新打印我们会发现与浮点数原始的字节完全一致。注意:C#是低字节在前");             Console.WriteLine(string.Join(",", reverseBuffer));             Console.ReadLine();         }     } }二、程序运行结果:

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有