能不能给我讲讲C语言中实数的二进制形式,是怎样存储的?

作者&投稿:休爬 (若有异议请与网页底部的电邮联系)
能不能给我讲讲C语言中实数的二进制形式,是怎样存储的~

实数也就是小数的存储,小数的存储是IEEE754标准存储的,以C语言为例float类型占32位,double类型占64位,以float类型来说,这32位的float有1位表示小数的符号,8位表示指数,23位表示底数。换句话说,你可以使用一种叫位域的结构来定义它们。比如
struct bit_float{int s:1;int e:8;int m:23};如果使用c++则可以使用 bitset的标准类库模板来进行操作。

C语言中实数在内存单元中按照指数形式存放。

float 单精度浮点数在机内占 4 个字节,用 32 位二进制描述。

double 双精度浮点数在机内占 8 个字节,用 64 位二进制描述。

浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。

数符占 1 位二进制,表示数的正负。

指数符占 1 位二进制,表示指数的正负。

尾数表示浮点数有效数字,0.xxxxxxx, 但不存开头的 0 和点。

指数存指数的有效数字。

指数占多少位,尾数占多少位,由计算机系统决定。

可能是数符加尾数占 24 位,指数符加指数占 8 位 -- float。

数符加尾数占 48 位,指数符加指数占 16 位 -- double。

知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。

对编程人员来说,double 和 float 的区别是 double 精度高,有效数字 16 位,float 精度 7 位。但 double 消耗内存是 float 的两倍,double 的运算速度比 float 慢得多,C 语言中数学函数名称 double 和 float 不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。

类型    比特数    有效数字    数值范围

float    32    6-7    -3.4*10(-38)~3.4*10(38)    

double    64    15-16    -1.7*10(-308)~1.7*10(308)    

long double    128    18-19    -1.2*10(-4932)~1.2*10(4932)    

简单来说,Float 为单精度,内存中占 4 个字节,有效数位是 7 位(因为有正负,所以不是8位),在 VC++6.0 平台中默认显示是6位有效数字;double为 双精度,占 8 个字节,有效数位是 16 位,但在 VC++6.0 平台中默认显示同样是 6 位有效数字

C 语言和 C# 语言中,对于浮点类型的数据采用单精度类型float和双精度类型double来存储,float数据占用 32bit,double数据占用 64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?不论是 float 还是 double 在存储方式上都是遵从 IEEE 的规范 的,float 遵从的是 IEEE R32.24 ,而 double 遵从的是 R64.53。

无论是单精度还是双精度在存储中都分为三个部分:

  • 符号位(Sign):0 代表正,1 代表为负。

  • 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储。

  • 尾数部分(Mantissa):尾数部分。

下面举例一个浮点数如何存储转换的(以float为例)


以浮点数18.75为例


首先转化为二进制即10010.11

转化为科学计数法即1.001011*2的e次方(e=4)

这个指数的值就是阶码的值,正数所以符号位为0,小数点后的为尾码,超出去部分舍掉并取整。

所以最终存储为0 10000011 0010110 00000000 00000000

同理可得-18.75的存储为1 10000011 0010110 00000000 00000000

1、float类型数字在计算机中用4个字节(32位)存储。

遵循IEEE-754格式标准:
一个浮点数由3部分组成:符号位s(1位)和、指数e(8位)、底数m(23位)

 

2、格式
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

S:符号位
E:指数,十进制指数加上127后的值得二进制数据
M:底数

 

3、符号位

指底数的符号,可正可负。

 

4、指数

占用8bit的二进制数,可表示数值范围为0-255。

但是指数可正可负,所以,IEEE规定,此处算出的次方必须减去127才是真正的指数。

所以,float类型的指数可从-126到128

 

5、底数

实际是占用24bit的一个值,但是最高位始终为1,所以,最高位省去不存储,在存储中占23bit
科学计数法。

 

再举一例:
17.625在内存中的存储

首先要把17.625换算成二进制:10001.101

在将10001.101右移,直到小数点前只剩1位:
1.0001101 * 2^4  因为右移动了四位

底数:因为小数点前必为1,所以IEEE规定只记录小数点后的就好。所以,此处的底数为:0001101
指数:实际为4,必须加上127(转出的时候,减去127),所以为131。也就是10000011
符号:整数,所以是0


综上所述,17.625在内存中的存储格式是:
01000001 10001101 00000000 00000000



实数也就是小数的存储,小数的存储是IEEE754标准存储的,以C语言为例float类型占32位,double类型占64位,以float类型来说,这32位的float有1位表示小数的符号


能不能给我讲讲C语言中实数的二进制形式,是怎样存储的?
对编程人员来说,double 和 float 的区别是 double 精度高,有效数字 16 位,float 精度 7 位。但 double 消耗内存是 float 的两倍,double 的运算速度比 float 慢得多,C 语言中数学函数名称 double 和 float 不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。类型 比...

各位大神帮帮忙,谁能给我具体讲解一下,c语言返回值,就是return,这个我...
return a+b } int a,int b就是参数,告诉编译器,我的这个函数将会传入两个数据,而且这两个数的类型是int,add 前面的int 是想表达:按照规则计算完后,函数将会返回一个int 类型的值;当然也可以这样 void printfun(int a);\/\/对参数进行处理,但是不用返回结果(不关心结果)int func(void)...

谁能给我讲讲C语言中字符串是怎么定义的?自己看书不理解.
字符串定义其实很简单在c\/c++语言中定义一个字符串可以使用如下的语法:char *s1=“string1”;\/\/定义字符串常量,指针形式 char s2[]=“string2”;\/\/定义字符串常量,数组形式 char *s3=new char[10];\/\/定义字符串变量并分配内存 指针形式 strcpy(s3,"string3");\/\/为s3赋值 char s4[10]...

...用if。中间的几个if语句看不懂,能给我讲讲吗?
第一个if,作用是:如果a>b,就借用tem变量,把a 和b的值交换一下。确保交换之后a不大于b。第二个if,执行后,把a与c中较小的数放在a中,即a不大于c。第三个if,确保了a不大于d。通过运行前三个if语句,把abcd四个数中最小的数字放在了变量a中。同样,第四和第五个if语句,把bcd三个数...

谁能给我讲一下C语言中程序以及各类型数据存储位置
一个由c\/C++编译的程序占用的内存分为以下几个部分1、栈区(stack) 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

你问的那个c语言的问题,能给我讲讲吗
楼上回答是错的,不是因为float类型小数点后两位有效,而是因为float类型有效位为6位,它只能保证6位数字是准确的,在6位有效数字以后的数都是没有意义的,不信你可以试试1000\/3.0或者100\/3.0,会发现小数点后精确的位数更多了。其实这根本跟小数点后的位数没有关系,只是因为float取6个有效位罢了...

C语言初级题目,刚学,不太会!给讲讲!
int a, b, c, d; \/\/分别保存个十百千位的数字 printf( "Enter the number:" ); \/\/用户提示信息 scanf( "%d", &num ); \/\/输入数字,要保证是4位的 a = num % 10; \/\/用num对10取模,为个位数 num = ( num - a ) \/ 10; \/\/n原来的num减去各位再除10,得到...

一道c语言题,大神能不能给讲讲为什么还会输出4 3?
输出应该是 2 1 4 3 ,因为main函数中xy和fun函数中xy是颠倒的,不要被xy迷惑了。可能你不清楚的是最后咋会有4、3,在fun函数中,*x *y是对xy指向的地址赋值,所以推出函数,main函数中xy值还是被改变成4、3了,最后自然输出4、3

请大家帮忙讲讲C语言的自定函数越具体易懂越好。
在max函数体中的return语句是把a(或b)的值作为函数的值返回给主调函数。有返回值函数中至少应有一个return语句。在C程序中,一个函数的定义可以放在任意位置,既可放在主函数main之前,也可放在main之后。例如:可把max 函数置在main之后,也可以把它放在main之前。修改后的程序如下所示。【例8.1】...

C语言概念性问题,拜托大家给我讲讲
int a=10;\/\/函数后面定义肯定不行啦,编译器都通不过 C中,在局部变量前加一个static 的话就成了静态局部变量。它的特点:同一次函数调用内它的值可以被保存到下一次执行该函数内使用到该变量的语句中,但是不能保存到下一次该函数的调用!! 你可能不理解,但是我没时间给你编程举例子,以后有...

吴川市19344043000: 能不能给我讲讲C语言中实数的二进制形式,是怎样存储的 -
丑郑东维: 实数也就是小数的存储,小数的存储是IEEE754标准存储的,以C语言为例float类型占32位,double类型占64位,以float类型来说,这32位的float有1位表示小数的符号,8位表示指数,23位表示底数.换句话说,你可以使用一种叫位域的结构来定义它们.比如 struct bit_float{ int s:1; int e:8; int m:23 };如果使用c++则可以使用 bitset的标准类库模板来进行操作.

吴川市19344043000: C语言中怎么输入一个实数,并输出double型在内存中的存储二进制表示 -
丑郑东维: float a = 1.2; printf("%08x", *((unsigned int*)&a));

吴川市19344043000: 二进制数,在C语言中有没有二进制的表示方法 -
丑郑东维: 编程时,若在十进制数字前面加上前缀0,如052,则编译器把该数字视为八进制而不是十进制,就像0x50一样,所以像069这样的数字是不合法的,因为八进制不能含有8及其以上的数字.标准C对二进制前缀没有规定,因为二进制不能直接用来参与运算,都是用十进制,十六进制,八进制来做的.

吴川市19344043000: C语言编程 实数数制转换程序 -
丑郑东维: #include#include void decimal(int x) { int a[16],i=15; while(x!=0){a[i]=x%10;x/=10;i--;} printf("转换为十进制:"); while(++i<16){printf("%d",a[i]);} printf("\n\n"); } void hex(int x) { int a[8],i=7; while(x!=0){a[i]=x%16;x/=16;i--;} printf("转换为十...

吴川市19344043000: 在C语言中,整数23用二进制位怎么表示 -
丑郑东维: 在C语言中,前面加0b表示二进制,加0x表示十六进制,数字前加0表示八进制 十进制整数23,用二进制表示为 0b10111

吴川市19344043000: 请问C语言中将实型数据转换为二进制数据的程序是什么? -
丑郑东维: 提一个方法吧 定义一个union把整数和你用实型数据放在一块,用printf("%x")的办法把整数的16进制输出来,你就能看到实型数据的16进制怎么写了

吴川市19344043000: C语言中二进制数字的前缀是什么? -
丑郑东维: 有,0BXXXXXXXX,代表二进制,C语言中也可以用二进制.但造成程序可读性不强(如果是配置寄存器,个人感觉比十六进制可读性强,可读性最好的是例如:PORTA&=~(1<<5);将PA.5置零,PORTA|=(1<<5);pa.5=1)

吴川市19344043000: c语言里二进制数 -
丑郑东维: 计算机数据(整数类)有三个概念原码、 反码 、补码,而计算机实际应用中所用到的只有补码! 以一个字节(8bits)为例说明 原码:第一位为符号位,其余位表示数值, 如0 000 0001表示1 ,1 000 0001表示-1 反码:正数原码即是其反码,负数反码为:符号位不动,其余位取反,即0变1,1变0,如:-1反=1 111 1110 补码:正数原码即是其补码,负数补码为反码+1,即-1补=1 111 1111 补码才是计算机中存储的数据形式!!原码、反码只是两个中间概念词,应用中用不到,是计算机发展过程中的中间产物.

吴川市19344043000: 能不能帮我写一个c语言程序,十进制实数转化成二进制,八进制,十六进制,谢谢啦 -
丑郑东维: #include <stdio.h> main() { int a; printf("Enter a character:"); scanf(“%d”,&a); printf("16进制:%X\n",a); printf("8进制:%o\n",a); char bin[32]; DecToBin (a,bin) printf("2进制:%s",bin); } void DecToBin (unsigned int iDec, char pBin[32...

吴川市19344043000: c语言编写 实数数制转换程序 -
丑郑东维: 望采纳,谢谢#include int main() { printf("\033[1;33m======================\n请输入一个十进制数:"); int a, b, i ; char charx[50]; scanf("%d", &a); printf("======================\n"); printf("你希望你的十进制数被转换为几进...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网