今天看视频讲座的时候忽然发现浮点数的内存表示居然不会,从网上抄点先放着.
浮点数在c/c++以及java中的内存布局遵循IEEE标准的,首先看一下IEEE所规定的存储的方式:
原码 补码 反码 移码
符号位 指数位 小数部分 指数偏移量
单精度浮点数 1 位[31] 8位 [30-23] 23位 [22-00] 127
双精度浮点数 1 位[63] 11 位[62-52] 52 位[51-00] 1023
解释一下,首先float变量按上述标准是4个字节,其中最高位为符号位,1代表此浮点数为负数,0代表正数,接下来的8位为指数位,范围0~255,,IEEE规定了一个偏移量127,指数位的值减去127为小数的偏移。低23位为小数部分,这23位是来描述浮点数的值,偏移为0的情况下,这23位数是一个浮点数的小数部分,也就是说位于小数点的右边。比如
0x3fc00000
符号位:0 ->说明是正数。
指数位:011 1111 1 -->偏移0
小数位:100 0000 0000 0000 0000 0000,-->1.10000000000000000000000为1.5
而按照规定,小数点前还隐含包括1,而这个1是不储存的,所以小数位实际是1.5,当偏移大于0时,小数点向右偏移相应的值,反之向左偏移相应的值。
以上就是IEEE的存储的基本原理,现在验证下,加深印象
#include <iostream><br>using namespace std; <br>int main() <br>{ <br> float a=0.0; <br> unsigned char *p=(unsigned char *)&a; <br> *p=0; <br> p++; <br> *p=0; <br> p++; <br> *p=0xc0; <br> p++; <br> *p=0x3f; <br> cout system("pause"); <br>} <br>//输出1.5 <br>0x40c00000 <br>符号位:0 ->说明是正数。 <br>指数位:100 0000 1 -->偏移2</iostream>
小数位:100 0000 0000 0000 0000 0000,
由于偏移为2,1.100 0000 0000 0000 0000 0000变成了110.0 0000 0000 0000 0000 0000 所以0x40c00000值为6,同理0x3f400000值为0.75.
类似的我们可以明白double变量的内存布局了。由于小数位的计算方式比如11.11111...在计算时为1*2^1+1*2^0+1*2^(-1)+1*2^(-2)....可以看出在表示小数时,flaot的值不是连续的,事实上浮点数,以IEEE标准所能精确表示的仅仅是其中的一部分。
例如0.3,就不能被float所精确表示,如下面代码:
#include <iostream><br>using namespace std; <br>int main() <br>{ <br> float a=0.3; <br> cout.precision(20); <br> for (int i=0;i { <br> cout } <br> cout system("pause"); <br>} <br>可以算出float所能精确表示的个数,32位每位两个有限的状态~~~~~ <br>了解了float布局,相应的下面代码问题的原因也就找到了~~~~</iostream>
#include <iostream><br>using namespace std; <br>int main() <br>{ <br> float a=2; <br> int *p=(int*)&a; <br> cout cout system("pause");</iostream>
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Demon__Hunter/archive/2008/12/20/3566232.aspx
分享到:
相关推荐
例如,浮点数-12.5在内存中以16进制表示为0xC1480000。我们解析这个值: - 符号位S为1,表示这是一个负数。 - 阶码E是10000010(130),减去偏移量127,实际指数为3。 - 尾数M是10010000000000000000000,但最高位1...
根据给定文件的【部分内容】,我们可以挖掘出与浮点数内存表示相关的知识点。 ### 浮点数内存表示 #### 1. 浮点数的概念 浮点数是一种数学上的表示方法,用于在计算机中表示实数,尤其是那些非常大或者非常小的...
浮点数在内存中的表示方法遵循一套标准,通常在C/C++编程中,这一标准是IEEE 754。IEEE 754规定了浮点数如何被编码为二进制形式,以便计算机能有效地存储和计算它们。浮点数的存储格式包括三个主要部分:符号位、...
本文将深入探讨C语言中浮点数的二进制表示,并通过一个具体的例子来解释浮点数和整数在内存中的差异。 #### 浮点数的背景 在讨论浮点数的具体表示之前,我们首先需要了解几个基本概念: - **浮点数**:用于表示...
原码非 0 值浮点数的尾数数值最高位必定为 1,则在保存浮点数到内存前,通过尾数左移,强行把该位去掉,用同样多的位数能多存一位二进制数,有利于提高数据表示精度。 本文档详细讲解了浮点数的表示、规格化和 IEEE...
根据 IEEE 标准,浮点数在内存中的表示是将特定长度的连续字节的所有二进制位按特定长度划分为符号域、指数域和尾数域三个连续域。 符号域(Sign bit)用于表示浮点数的符号,1 代表负数,0 代表正数。 指数域...
总之,浮点数在内存中的存储是一个复杂但重要的主题,它涉及到计算机科学的多个方面,包括数据表示、数值计算和硬件设计。通过深入学习和理解浮点数的存储格式,我们可以更好地掌握计算机处理浮点数的方式,从而提高...
浮点数表示方法是计算机科学中处理实数的一种方式,主要遵循IEEE-754标准,它定义了浮点数的存储格式,包括单精度和双精度两种。单精度浮点数占用32个比特(4字节),而双精度浮点数则占用64个比特(8字节)。这两种...
浮点数在计算机内存中的存储格式 浮点数在计算机内存中的存储格式对浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储。float数据占用32bit,double数据占用64bit。当我们声明一个变量float f = 2.25f...
**IEEE浮点数表示法详解** 在计算机科学中,浮点数的表示是至关重要的,尤其是在数值计算和科学计算领域。IEEE(国际电气和电子工程师协会)制定了浮点数的标准表示法,即IEEE 754标准,它规定了如何在二进制系统中...
符号位用于表示浮点数的正负号,指数位用于表示浮点数的指数,尾数位用于表示浮点数的小数部分。 在 IEEE754 的浮点数存储格式中,float 类型的浮点数占 32 位,double 类型的浮点数占 64 位。float 类型的浮点数...
在计算机科学中,浮点数(如`float`)是一种数据类型,用于表示可能有小数部分的数值。`float`在C#中是单精度浮点数,它在内存中按照IEEE 754标准存储,占用32位(4字节)。这个标准定义了如何将一个浮点数转换为二...
例如,一个单精度浮点数1.2345的内存表示可能是:0(正数)10000001(指数偏移后为1)101001010010010010010010(尾数二进制形式,隐藏的1省略)。 2. 双精度浮点数(Double Precision): 双精度浮点数在内存中...
这款工具允许用户查看内存地址空间中浮点数的十六进制表示,这对于调试、分析或验证数据传输的正确性至关重要。 浮点数在计算机内部是以二进制格式存储的,这种存储方式遵循IEEE 754标准,该标准定义了如何用固定...
由于计算机内存和处理能力的限制,不能精确地存储所有的实数,因此产生了浮点数表示方法。浮点数的核心概念包括尾数、基数、指数和符号,类似于科学计数法。尾数(Mantissa或有效数字)是小数部分,基数(Base)通常...
浮点数是一种表示带有小数部分的数值的方式,而十六进制是一种基数为16的数字系统,常用于存储和表示二进制数据。在C语言中,理解和操作这两种类型的数据对于开发高效和精确的程序至关重要。 浮点数在计算机内部...
浮点数是一种表示实数的方式,它包括一个符号位、指数部分和尾数部分,而十六进制(Hexadecimal)是数字系统中的一种表示方式,常用于简化二进制的表示,尤其在编程和内存地址中。 在单片机编程中,浮点数的处理...
在计算机领域,十六进制常用于表示内存地址、颜色值等,因为它比二进制更简洁,比十进制更方便与二进制进行转换。 浮点数转换为十六进制的过程涉及到两个步骤:首先,将浮点数转换为其二进制表示;然后,将这个二...
1. **浮点数表示**:浮点数在内存中以IEEE 754标准存储,分为单精度(32位)和双精度(64位)两种形式。打印时需要将其转换为人类可读的十进制格式。 2. **浮点数转换**:在资源有限的嵌入式系统中,我们可能需要...
内存中的浮点数表示是计算机科学中的一个重要概念,尤其是在编程语言如C#中。这个"内存中浮点数的显示demo.7z"压缩包显然包含了一个示例程序,用于帮助理解浮点数在内存中的存储方式。让我们深入探讨一下浮点数在...