整形数int、浮点型数据float,在内存中存储的表示

引言: 突然想到一个底层问题。
计算机组成原理里学的:定点整数 定点小数 浮点数;
编程里的基本数据类型int float在内存中的存储形式;
二者究竟的对应关系是?
CSDN博客里有这样一句话,“实数在内存中以规范化的浮点数存放”,请先理清“实数”是多大范围再回味这句话!
我在书上看到这样一句话,“一般高档微机以上的计算机中同时采用定点、浮点表示,由使用者进行选择,而单片机多采用定点表示”,可以猜测这个“使用者”应该指的是各中编程语言的编译器咯!


正文整形数int、浮点型数据float,在内存中存储形式表示方法
*****float型在内存中占4个字节,即32位,同样int或long型也占4个字节,在对各自的32位进行逐位分解后发现,它们所代表的具体意义却相差甚远。


*****首先分解整形的32位,对于无符号整形(unsigned int) ,分解如下:至右向左把第i位的值记为bi(0或1),则这一位代表的十进制数值为:bi * 2^i, i=0,2,...31。整形的4个字节(32位)二进制数折算成十进制数为:b31 * 2^31 + ... + bi * 2^i + ... + b1 * 2 + b0 * 1 ——记为“公式@”。


*****对于有符号整形(signed int),最高位(第31位)代表符号,0正1负,剩余的31位必须减1再各位取反,记为“操作#”,然后按以上“公式@”得出这个整形数的绝对值。


*****以上作为一个引子,以下float分解也必须建立在此基础上,记住“操作#”和“公式@”两个约定的含义。同时纠正一下提问者的说法“能表达的范围应该也就0-2^32”,整型准确的数值范围为:有符号( (-2^31) —— (2^31-1)),无符号( 0 —— (2^32-1) )。下面引导到关键问题上,float的32位在内存中到底分别代表什么意义?
    
*****把所有32位用b31-b0(从高到低)表示,b31同样是符号位,其意义为0正1负。b30-b23总共8位是一个有符号整形(signed int),先后用“操作#”和“公式@”计算得到一个数值E (十进制范围是-128 —— 127),再由它经过指数运算得到2^E,十进制范围是:1.0 * 10^(-38) —— 1.7 * 10^38 。余下的23位b22-b0代表小数值,其中b22代表的十进制数值为:b22 * 2^(-1)即b22 * 0.5, b21代表的十进制数值为:b22 * 2^(-2)即b22 * 0.25,以此类推,所以小数范围为0 —— 1(实际为0.0000…1 至 0.9999…) 。


*****从以上分解可知,float的32位都有了各自的意义,可以分为3块,符号块S (b31),指数块E (b30-b23),小数块D(b22-b0),但如何组装成一个实际的小树呢?具体算法就是:
(-1)^S * (1.0 + D) * 2^E ,最终数值范围是-3.4*10^-38 —— 3.4*10^38。


*****最后提醒一下,所有浮点数在进出内存时都经过相应的硬件进行以上“操作#”和“公式@”。编程人员无需深究其中细节,如若是出于好奇心,那是值得理解并支持地。

猜你喜欢

转载自blog.csdn.net/QQ384697384/article/details/42711251