⑴ c语言实型(浮点型)数据在内存中的存放形式
实数分为float型和double型,它们分别对应IEEE 754标准中的单精度浮点数和双精度浮点数类型,在内存中的存储形式遵守IEEE 754浮点数标准。以float类型数据为例,3.14159表示成二进制为11.0010010000111111001111......,规格化后表示为1.10010010000111111001111×2^1(小数点后保留23位有效数字,因为IEEE 754标准规定的尾数为23位);指数为1,故阶码为1+127=128=10000000;这是一个正数故符号位为0,因此它在内存中的表示形式是0 10000000 10010010000111111001111,写成16进制为40490FCF。
⑵ c语言中double和float它们存储时分别占据多大的内存空间
double
中文译为双精度浮点数,一般称双精度数,它在内存中占用8个字节(位、bit)的空间;float
中文译为单精度浮点数,一般就称为浮点数,它在内存中占用4个字节的空间。
⑶ C语言二进制浮点数储存方式
float 单精度说明符,在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。
double 双精度说明符。双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
其实记起来非常简单的- -!!
自己编个程序看看~~
void main()
{
float a;
double b;
a=33333.33333;
b=33333.33333333333333;
printf("a=%f\n,b=%f\n",a,b);
}
然后~~~
答案是
a=33333.332131
b=33333.333333
由于a 是单精度浮点型,有效位数只有七位。而整数已占五位,故小数二位后之后均为无效数字。(就是2131那部分)。
b 是双精度型,有效位为十六位。应该显示全部小数,但是!!!!Turbo C 规定小数后最多保留六位,其余部分四舍五入。所以答案是这个。。
这样解释的行吗?打字太累了~~~
⑷ C语言浮点数的储存方式为何浮点数储存不准确那个图片是什么意思
C语言中,无论是单精度还是双精度在存储中都分为三个部分:
1. 符号位(Sign) : 0代表正,1代表为负
2. 指数位(Exponent)(注:也叫阶码):用于存储科学计数法中的指数数据,并且采用移位存储(注:移码编码表示)
3. 尾数部分(Mantissa):尾数部分
关于不精确是由于十进制小数部分化二进制,常常化不尽。如同无限循环小数,最后有截断误差。
图片中的是float型的变量的存储上的格式。
⑸ C语言中浮点数为什么不能准确存储
浮点数,即双精度double型或单精度float型,拿双精度的double来说,定义一个double型的变量,如
double
a;那么a在内存中开辟了一个32位的空间来存储变量a,但是你要存储变量a,计算机要将浮点数a用一个定点整数和一个定点小数表述,在对阶码的时候,由于各个计算机CPU的字长不一样,可能造成对阶时产生小数部分丢失,这样造成了存储不准确。建议看看组成原理。
⑹ 关于浮点数在C语言中的存储问题
你要明白计算机内存只能存储二进制数据,因此人类习惯的十进制只能通过一定的格式进行转换,只要是转换,就有可能丢失精度.实际上大部分CPU对浮点数和双精度都是按国际规定格式操作的,而转换工作也是CPU内部的基础功能之一.听说过"XXCPU的浮点运算很强"这样的说法吧.其实这也就是在讲CPU对浮点数或者双精度进行解码编码以及运算的能力/效率.
给你段代码你可以自己调试玩玩可以帮助你理解,你可以修改fl的初始值查看各种浮点数
#definePAUSEsystem("pause")//这个复制到主函数外面
charc,*p1;
char*p;
floatfl=-3.1415926f;
float32*fp;
uintu,e,i;
byteb;
fp=(float32*)&fl;
cout<<"解析浮点数"<<fl<<"在内存中的16进制编码"<<endl<<endl;
p=MemMap::ToString(fl,'x',1);
cout<<"内存中字节的存储顺序:"<<endl<<p<<endl<<endl;
delete[]p;
p=MemMap::ToString(fl,'x');
cout<<"转置后的字节顺序:"<<endl<<p<<endl<<endl;
delete[]p;
p=MemMap::ToString(fl,'0');
cout<<"二进制码:"<<endl<<p<<endl<<endl;
delete[]p;
p=MemMap::BitMap((void*)&fl,0x80000000);
cout<<"符号的位图(1代表负数,0代表正数):"<<endl<<p<<endl<<endl;
delete[]p;
p=MemMap::BitMap((void*)&fl,0x7f800000);
cout<<"阶码的位图:"<<endl<<p<<endl;
delete[]p;
e=fp->exp-127;
cout<<"提取阶码其值为:"<<fp->exp<<",译码后为:"<<fp->exp-127<<",意思为小数点向右移"<<e<<"位。"<<endl<<endl;
p=MemMap::BitMap((void*)&fl,0x007fffff);
cout<<"尾数的位图:"<<endl<<p<<endl;
delete[]p;
u=fp->m|0x00800000;//补上二进制尾数的最高位
p=MemMap::ToString((void*)&u,4,'b');
cout<<"编码时整数的1是省略的,因此补上1,也即小数点在尾数之前:"<<endl<<p<<endl;
delete[]p;
i=u>>(23-e);
cout<<"根据阶码向右移动小数点并取出整数部分:"<<i<<endl;
i=0xffffffff;
i=i>>(32-23+e);
i=i&u;
cout<<"小数部分转十进制为:"<<abs(fl)-3<<endl;
PAUSE;
下面是运行结果:
⑺ c语言中浮点型数据的存储方式
所谓浮点数, 其实就是二进制的科学计数法. 十进制的科学计数法为 a.b * 10^n (这里 "^" 表示幂). 其中a 大于或等于1而小于10. 只有0不能用这个形式表示.
二进制的科学计数法为 1.x *10^N, 整数部分恒为1, 所以只要存贮X与N就可以.一般都是用一个位存贮符号, 再用几个二进制位存贮X, 另几个二进制位存贮N. 原则就是这样了, 但具体的格式又有所区别. 比如按IEEE来说, 有单精度, 双精度等; 还有一些软件自己定义的格式, 空间哪些位存贮X, 哪些位存贮N, 0怎么办, NaN怎么表示, 等等都要自己规定.
⑻ c语言中double型数据在内存中 占多少个字节来存储
c语言中double(双精度浮点型)是计算机使用的一种数据类型。double(双精度浮点型)使用 64 位(8字节) 来储存一个浮点数。 它可以表示十进制的15或16位有效数字,其数值范围为-1.79769313486232E308 到1.79769313486232E308。
(8)c语言浮点数的存储扩展阅读:
double(双精度浮点型)数值可转换到其他类型的整数或浮点数,反之亦然。double(双精度浮点型)常量的最后一个字符可加上“d”或“D”。其存储格式与浮点型类似,最高位为符号位,次高11位为指数位,其次52位为尾数。
double(双精度浮点型)同数值型比,它能提供更高的数值精度,采用固定存储长度的浮点数形式,与数值型数据不同,它的小数点位置是由输入的数据值来决定的,并且只能用于表中的字段。
⑼ c语言浮点数存储问题:c语言浮点数在内存中的存储形态是什么样的3个字节存储有效数字的范围为什么是6到7
C语言的浮点数遵循 IEEE 754 标准,请查阅相应资料即可。
浮点数的含义就是小数点不是固定的,其精度也不是固定的,举例来说,C语言中的float类型占用4个字节长,这4个字节分为如下3部分:
1位符号位 8位阶码 23位尾数部分
这23位尾数才真正存储了二进制的有效位,将这23位二进制转换为十进制也就6到7位有效数字。
⑽ 在c语言中,不带任何修饰符的浮点常量是按什么类型数据存储的
在c语言中,不带任何修饰符的浮点常量是按double类型数据来存储的。
下面这个例子就能验证:
#include <stdio.h>
int main()
{
printf("sizeof(double)=%d ",
sizeof(double));
printf("sizeof(float)=%d ",
sizeof(float));
printf("sizeof(1.1)=%d ",
sizeof(1.1));
printf("sizeof(1.1F)=%d ",
sizeof(1.1F));
return 0;
}
运行截图: