浮点型在计算机内的存储方式

数据在计算机内都是二进制存储的,存储运算都使用的是补码。
原码
就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码
正数的补码与其原码相同;负数的补码是在其反码的末位加1。
浮点数在计算机中存储分为3个部分:
IEEE 754格式的浮点数由三个字段组成:符号位,偏置指数和分数
单精度浮点数float符号位占1个字节、偏移指数占8个字节、分数占23个字节
1、把浮点数转为2进制形式,如0.00101
2、将二进制形式移位变成科学技术法形式,如:0.00101 = 1.01 * 2^-3
3、得到分数和指数,如这里分数为.01,指数为-3
4、偏差指数 = 指数 + 偏差 float的偏差为127,这里得到偏差指数为 124
5、存储格式为:符号位 + 偏差指数(2进制) + 偏差 ,如这里存储为0 00011111 0100000 00000000 00000000

32位浮点数转二进制存储:
* 参考链接:   https://en.wikipedia.org/wiki/IEEE_754-1985

       https://blog.csdn.net/jjj19891128/article/details/22945441
* 步骤1:整数转二进制 不停/2的做法,将每个余数依次相加
* 步骤2:小数转二进制 不同*2 <1 计0, >1 计1,用(x-1)继续往后做*2操作
* 步骤3:整数部分和小数部分二进制粘合起来,注意小数点不要去除
* 步骤5:将2进制变成1.xxxx * 2^n 次方的形式,整数+小数一共24位,小数点不计位数,对应IEEE 754-1985标准中的小数占位,(第24位可能要采用前面的舍入原则), 得到指数
* 步骤6:利用指数-标准偏差值(float为127)得到偏差指数
* 步骤7:符号位+偏差指数的二进制(8位)+小数部分二进制 就是该float的存储形式的原码,存储即是原码转为补码存储。
* 维基百科中float的例子的操作: 0.15625得到原码
* 整数部分0,得到二进制也就是0
* 小数部分:
* 0.15625 * 2 = 0.3125 0
* 0.3125 * 2 = 0.625 0
* 0.625 * 2 = 1.25 1
* 0.25 * 2 = 0.5 0
* 0.5 * 2 = 1.0 1
* 0 * 2 = 0 0
* ......
* 粘合得到二进制为:0.00101000000000000000000.....
* 转换1.xx * 2^n 形式,并截取长度为24: 1.0100000 00000000 00000000 * 2 ^ -3
* 得到偏差指数为127 -3 = 124
* 124转二进制 8位存储为:00011111
* 填充符号位 + 偏移指数 + 小数存储部分 得到原码: 0 00011111 0100000 00000000 00000000

原文地址:https://www.cnblogs.com/aigeileshei/p/10518133.html

时间: 2024-10-12 12:00:43

浮点型在计算机内的存储方式的相关文章

浮点型在内存当中的存储方式

浮点型变量在计算机内存中占用4字节(Byte),即32-bit.遵循IEEE-754格式标准. 一个浮点数由2部分组成:底数m 和 指数e. ±mantissa × 2exponent (注意,公式中的mantissa 和 exponent使用二进制表示) 底数部分 使用2进制数来表示此浮点数的实际值. 指数部分 占用8-bit的二进制数,可表示数值范围为0-255. 但是指数应可正可负,所以IEEE规定,此处算出的次方须减去127才是真正的指数.所以float的指数可从 -126到128. 底

java 20 - 8 字节流的文件复制以及汉字在计算机中的存储方式

复制文本文件:把当前目录下的FileIntputStream.java文件里面的内容复制到当前目录的b.txt文件中 分析: 数据源: FileIntputStream.java -- 读取数据 -- FileInputStream 目的地: b.txt --- 写入数据 ---- FileOutputStream 思路:首先读取数据源的内容,然后把读取到的内容再写入到目的地中 前提:数据源存在,否则会报错 1 import java.io.FileInputStream; 2 import j

一道题回顾计算机数值存储方式-原码,反码,补码

突然想到了计算机的补码,现在利用这个题目回顾一下相关知识点 unsigned char ch = -1; int val = ch; val的最终值是255: 换算成二进制一下,-1的源码:1000 0001,反码:1111 1110 ,负数在计算机中是以补码形式存储的,-1的补码:1111 1111 ch 变量是 无符号的,也就是整个补码的二进制位都是数值位,1111 1111 二进制位换算成十进制就是255,最终赋值给整数结果自然也是255 这道题目考察的就是计算机数值的存储方式,对于正数,

4 C 语言 数值存储方式 数组

源码 补码 反码 数组定义,初始化,使用,随机数 找最大数,逆置,冒泡排序, scanf 输入字符串 字符串处理 字符串溢出等问题 scanf() gets() puts() fputs() strlen() strcat() strncat() strcmp() strncmp() strchr() strstr() strtok() atoi() atof() atol() C 字符串数组 定义数组 遍历输出数组每个元素的值 //GCC 编译方式: C:\MinGW\project>gcc 

浮点型数据存储方式

C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53. 无论是单精度还是双精度在存储中都分为三个部分: 符号位(Sign)

浮点数在计算机内存中的存储方式

在计算机内存中,float型数据占4个字节,double型占8个字节,它们在计算机中的存储分为三个部分: 符号位:0代表正,1代表负. 指数位:将一个二进制数用科学计数法表示之后指数的值. 尾数位:用科学计数法表示的前面的数. 其中存储的方式如图 double型的数据存储方式与之类似,只不过能表示更大的数位 现在就用float型的数据来举例吧. 比如,12.5f为一个float型的浮点数,先把它转化为二进制数为1100.1,用科学计数法表示为1.1001*2^3.现在就可以表示把这个二进制数分为

浮点数在计算机中存储方式

浮点数在计算机中存储方式 C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是float还是double在存储方式上都是遵从IEEE的规范的, float遵从的是IEEE R32.24 ,而double 遵从的是R64.53. 无论是单精度还是双精度在存储中都分为三个

移码及浮点数在内存中的存储方式

首先说一下十进制的小数怎么转化为二进制的小数,计算机根本就不认识10进制的数据,他只认识0和1,所以,10进制的小数在计算机中是用二进制的小数表示的. 十进制的小数转化为二进制的小数的方法: 可以简单的概括为正序取整,将十进制的小数部分乘以2,然后取整数部分. 例如将0.2转化为二进制的小数,那么0.2*2=0.4,其整数部分是0,所以二进制小数的第一位为0,然后0.4*2=0.8,其整数部分是0,所以二进制小数的第二位为0,然后0.8*2=1.6,其整数部分是1,所以二进制小数的第三位是1,然

float浮点数的二进制存储方式及转换

int和float都是4字节32位表示形式.为什么float的范围大于int? float精度为6-7位.1.66*10^10的数字结果并不是166 0000 0000 指数越大,误差越大. 这些问题,都是浮点数的存储方式造成的. float和double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53. 无论是单精度还是双精度在存储中都分为三个部分: 符号位(Sign) : 0代表正,1代表为负 指数位(Exponent):