你这个问题非常有意义。
虽然我们都知道浮点数的格式定义在IEEE 754,我们可以换算出你定义的值。但是你这里打印的却不是我们换算出来的值,说明这样打印的方法有问题。
可以做以下试验证明:比如你定义3个一样的浮点数,float a, b ,c; a = b = c = 9.0;
理论上编码方式一样,打印出来就应该一样(无论值是什么)。可是用你的方法打印出来的结果是不一样的!!!哈哈!
具体原因我也不清楚,一直想在内存里面实际看看,最近工作忙,一直没有对比过。我怀疑是地址选择有些问题。也许用 printf("%x %x %x\n", *((unsigned int *) &a), *((unsigned int *) &b), *((unsigned int *) &c)); 打印可以解决问题。你可以试试看。或者用调试工具吊起来实际看看。
❷ 浮点数在计算机中的存储方式
应该是: 在一个为32bit的存储空间中存储浮点数,bit0~bit22存储有效数字部分;bit23~bit30存储指数部分;bit31存储符号位。 在一个为64bit的存储空间中存储浮点数,bit0~bit51存储有效数字部分;bit52~bit62存储指数部分;bit63存储符号位。 还一种 在一个为80bit的存储空间中存储浮点数,bit0~bit62存储有效数字部分;bit63~bit78存储指数部分;bit79存储符号位。 只有这三种了,其他都不支持的 未来可能还有128位浮点数
❸ 计算机浮点数的储存原理
浮点是以单元形式储存在内存上的,但每个单元内存有限,所以比如你想输入1/3的话,你以为是1/3了,实际上不足1/3,而是0.3333333333333333,所以计算时,会以0.3333333333333333的形式去计算,而不是1/3,因此出现了本来是0.6的,而输出却是0.599976.建议把浮点精度变大
❹ float变量在内存当中是怎样存储的或是怎样的一种存储格式
浮点型变量在计算机内存中占用4字节(Byte),即32-bit。遵循IEEE-754格式标准。
一个浮点数由2部分组成:底数m 和 指数e。
±mantissa × 2exponent
(注意,公式中的mantissa 和 exponent使用二进制表示)
底数部分使用2进制数来表示此浮点数的实际值。
指数部分占用8-bit的二进制数,可表示数值范围为0-255。但是指数应可正可负,所以IEEE规定,此处算出的次方须减去127才是真正的指数。所以float的指数可从 -126到128.
底数部分实际是占用24-bit的一个值,由于其最高位始终为 1 ,所以最高位省去不存储,在存储中只有23-bit。
到目前为止, 底数部分 23位 加上指数部分 8位 使用了31位。那么前面说过,float是占用4个字节即32-bit,那么还有一位是干嘛用的呢? 还有一位,其实就是4字节中的最高位,用来指示浮点数的正负,当最高位是1时,为负数,最高位是0时,为正数。
浮点数据就是按下表的格式存储在4个字节中:
Address+0 Address+1 Address+2 Address+3
Contents SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM S: 表示浮点数正负,1为负数,0为正数
E: 指数加上127后的值的二进制数
M: 24-bit的底数(只存储23-bit)
主意:这里有个特例,浮点数 为0时,指数和底数都为0,但此前的公式不成立。因为2的0次方为1,所以,0是个特例。当然,这个特例也不用认为去干扰,编译器会自动去识别。
通过上面的格式,我们下面举例看下-12.5在计算机中存储的具体数据:
Address+0 Address+1 Address+2 Address+3
Contents 0xC1 0x48 0x00 0x00 接下来我们验证下上面的数据表示的到底是不是-12.5,从而也看下它的转换过程。
由于浮点数不是以直接格式存储,他有几部分组成,所以要转换浮点数,首先要把各部分的值分离出来。
Address+0 Address+1 Address+2 Address+3
格式 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
二进制 11000001 01001000 00000000 00000000
16进制 C1 48 00 00
可见:
S: 为1,是个负数。
E:为 10000010 转为10进制为130,130-127=3,即实际指数部分为3.
M:为 10010000000000000000000。 这里,在底数左边省略存储了一个1,使用 实际底数表示为 1.10010000000000000000000
到此,我们吧三个部分的值都拎出来了,现在,我们通过指数部分E的值来调整底数部分M的值。调整方法为:如果指数E为负数,底数的小数点向左移,如果指数E为正数,底数的小数点向右移。小数点移动的位数由指数E的绝对值决定。
这里,E为正3,使用向右移3为即得:
1100.10000000000000000000
至次,这个结果就是12.5的二进制浮点数,将他换算成10进制数就看到12.5了,如何转换,看下面:
小数点左边的1100 表示为 (1 × 23) + (1 × 22) + (0 × 21) + (0 × 20), 其结果为 12 。
小数点右边的 .100… 表示为 (1 × 2-1) + (0 × 2-2) + (0 × 2-3) + ... ,其结果为.5 。
以上二值的和为12.5, 由于S 为1,使用为负数,即-12.5 。
所以,16进制 0XC1480000 是浮点数 -12.5 。
上面是如何将计算机存储中的二进制数如何转换成实际浮点数,下面看下如何将一浮点数装换成计算机存储格式中的二进制数。
举例将17.625换算成 float型。
首先,将17.625换算成二进制位:10001.101 ( 0.625 = 0.5+0.125, 0.5即 1/2, 0.125即 1/8 如果不会将小数部分转换成二进制,请参考其他书籍。) 再将 10001.101 向右移,直到小数点前只剩一位 成了 1.0001101 x 2的4次方(因为右移了4位)。此时 我们的底数M和指数E就出来了:
底数部分M,因为小数点前必为1,所以IEEE规定只记录小数点后的就好,所以此处底数为 0001101 。
指数部分E,实际为4,但须加上127,固为131,即二进制数 10000011
符号部分S,由于是正数,所以S为0.
综上所述,17.625的 float 存储格式就是:
0 10000011 00011010000000000000000
转换成16进制:0x41 8D 00 00
所以,一看,还是占用了4个字节。
下面,我做了个有趣的实验,就是由用户输入一个浮点数,程序将这个浮点数在计算机中存储的二进制直接输出,来看看我们上面所将的那些是否正确。
有兴趣同学可以到VC6.0中去试试~!
#include<iostream.h>
#define uchar unsigned char
void binary_print(uchar c)
{
for(int i = 0; i < 8; ++i)
{
if((c << i) & 0x80)
cout << '1';
else
cout << '0';
}
cout << ' ';
}
void main()
{
float a;
uchar c_save[4];
uchar i;
void *f;
f = &a;
cout<<"请输入一个浮点数:";
cin>>a;
cout<<endl;
for(i=0;i<4;i++)
{
c_save[i] = *((uchar*)f+i);
}
cout<<"此浮点数在计算机内存中储存格式如下:"<<endl;
for(i=4;i!=0;i--)
binary_print(c_save[i-1]);
cout<<endl;
}
好了,我想如果你仔细看完了以上内容,你现在对浮点数算是能比较深入的了解了。
❺ 浮点型数据在内存中实际的存放形式(储存形式)
浮点型数据在内存中存储不是按补码形式,是按阶码的方式存储,所以虽然int和float都是占用了4个字节,如果开始存的是int型数据,比如是个25,那么用浮点的方式输出就不是25.0,也许就变的面目全非。
你可以用共用体的方式验证一下。在公用体中定义一个整形成员变量和一个浮点型成员变量,给整形赋值25,输出浮点成员变量,你就知道了。
❻ 计算机组成原理里的:定点整数 定点小数 浮点数 编程里的基本数据类型int float在内存中的存储
整型就是一般的存储,有符号数,最高位为符号位,0表示正数,1表示负数。
无符号数,就没有什么格式了。
浮点数,就比较复杂了,它是遵守的IEEE754浮点编码标准,拿FLOAT类型来说,这种类型是32位的,其中1位表示符号位,8位表示指数位,23位表示有效数字位。
简单的用公式表示:(-1)^S
*
M
^e。
S是符号位,M是有效数字,E是指数,你最好自己去搜索一下IEEE754浮点数编码的内容。
当然这种知识了解一下就好了。。参考资料推荐
:深入理解计算机系统
我记得是第二章中,有详细的介绍。
❼ 请问浮点型数据在计算机是怎么存储的
对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit。
无论是单精度还是双精度在存储中都分为三个部分:
1、符号位(Sign) : 0代表正,1代表为负。
2、指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储。
3、尾数部分(Mantissa):尾数部分。
(7)浮点数在内存中的存储有什么特点扩展阅读
实型变量分为两类:单精度型和双精度型,
其类型说明符为float 单精度说明符,double
双精度说明符。在Turbo
C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。
双精度型占8
个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
实型变量说明的格式和书写规则与整型相同。
例如: float x,y; (x,y为单精度实型量)
double a,b,c; (a,b,c为双精度实型量)
实型常数不分单、双精度,都按双精度double型处理。
❽ C语言的基本类型在内存中怎么储存的
C语言的基本类型在内存中以二进制的形式储存的。
1、整型数据:所有整数(正负零)在内存中都是以补码的形式存在。对于一个正整数来说,它的补码就是它的原码本身。对于一个负整数来说,它的补码为原码取反再加1。
2、字符型数据:把字符的相对应的ASCII码放到存储码单元中,而这些ASCII代码值在计算机中同样以二进制补码的形式存放的。
3、实型数据:也叫浮点数,在计算机中也是以二进制的方式存储,关键在于如何将十进制的小数转化为二进制来表示。
扩展资料:
根据计算机的内部字长和编译器的版本,C语言的基本类型表示的数的长度范围是有限定的。十进制无符号整常数的范围为0~65535,有符号数为-32768~+32767。八进制无符号数的表示范围为0~0177777。十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF。
如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。长整数158L和基本整常数158在数值上并无区别。
❾ 关于浮点型float数值是怎样在内存中存储的
单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双精度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。double float数据类型,计算机中表示实型变量的一种变量类型。此数据类型与单精度数据类型(float)相似,但精确度比float高,编译时所占的内存空间依不同的编译器而有所不同,通常情况,单精度浮点数占4字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,;双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308。
❿ 浮点数在计算机里面的存储
这个问题比较难..其实在实际运算过程中或写程序中我们要求的浮点数都有一定的精度,大多数情况下存成文件等形式我们一般会让他*10^n次方来存储去掉小数位.下面说正题.
何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2 字节)的short int型变量的值是1000,那么它的二进制表达就是:00000011 11101000。由于Intel CPU的架构原因,它是按字节倒序存储的,那么就因该是这样:11101000 00000011,这就是定点数1000在内存中的结构。
目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格:
````````符号位 阶码 尾数 长度
float 1 8 23 32
double 1 11 52 64
临时数 1 15 64 80
由于通常C编译器默认浮点数是double型的,下面以double为例:
共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位:
最高位63位是符号位,1表示该数为负,0正;
62-52位,一共11位是指数位;
51-0位,一共52位是尾数位。
按照IEEE浮点数表示法,下面将把double型浮点数38414.4转换为十六进制代码。
把整数部和小数部分开处理:整数部直接化十六进制:960E。小数的处理:
0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
实际上这永远算不完!这就是着名的浮点数精度问题。所以直到加上前面的整数部分算够53位就行了(隐藏位技术:最高位的1 不写入内存)。
如果你够耐心,手工算到53位那么因该是:38414.4(10)=1001011000001110.(2)
科学记数法为:1.001……乘以2的15次方。指数为15!
于是来看阶码,一共11位,可以表示范围是-1024 ~ 1023。因为指数可以为负,为了便于计算,规定都先加上1023,在这里, 15+1023=1038。二进制表示为:100 00001110
符号位:正—— 0 ! 合在一起(尾数二进制最高位的1不要):
01000000 11100010 11000001 11001101 01010101 01010101 01010101 01010101
按字节倒序存储的十六进制数就是:
55 55 55 55 CD C1 E2 40