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

Python013

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

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

c语言文件把数据看作是一连串的字符(字节)。C语言文件是一个字符(字节)的序列,是一字符流或字节流,是一种流式文件。根据数据的组织形式,可分为文本文件和二进制文件。

文本文件又称为ASCII文件,每一个字节中存放一个ASCII代码,代表一个字符。例如,一个整数123,若用.ASCII文件存放,占3个字节的

存储

单元,1、2、3各用一个字节

存储

。而1、2、3的ASCII码分别为49、50、51,故123用ASCII文件存放时,存放形式为001100010011001000110011。

二进制文件是直接用数据的二进制形式存放。例如,对整数123,二进制为0000000001111011,用二进制文件存放,需2个字节,存放形式为0000000001111011。

使用ASCII码文件,一个字节代表一个字符,便于对字符一一处理和输出,但占用较多的存储空间,并且要花费转换时间(ASCII码与二进制之间的转换)。使用二进制文件,

在内存中的数据形式与输出到外部文件中的数据形式完全一致,可以克服ASCII文件的缺点,但不直观,一个字节并不对应一个字符或一个数,不能直接输出字符形式。一般中间数据用二进制文件保存,输入输出使用ASCII文件。

二进制110.11=1×22+1×21+0×20+1×2-1+1×2-2=4+2+0+0.5+0.25=6.75

为了让大家更加详细了解二进制加减法的运算过程,我们提供了两张示意图。

1)二进制加法:0001+0001=0010

2)二进制减法:0010-0001=0001

而在我们的内存中,数据就是以二进制的形式存储的。

接下来我们来了解一下内存中数据的存储。

大家可能并不了解,其实计算机要处理的信息是多种多样的,如十进制数、文字、符号、图形、音频、视频等,这些信息在人们的眼里是不同的。但对于计算机来说,它们在内存中都是一样的,都是以二进制的形式来表示。

所以我们必须了解二进制后才能够更好地学习编程,因为它是计算机处理数据的基础。

需要大家理解的是内存条是一个非常精密的部件,包含了上亿个电子元器件,所以这些元件小到基本达到了纳米级别,而它们实际上就是电路;电路的电压会变化,要么是0V,要么是5V,只有这两种电压。5V是通电,用1来表示,0V是断电,用0来表示。按这个原理推想,一个元器件有2种状态,0或者1。

所以当我们通过电路来控制这些元器件的通断电,会得到很多0、1的组合。举个例子:8个元器件有28=256种不同的组合,16个元器件有216=65536种不同的组合。尽管一个元器件只能表示2个数值,但是多个结合起来就可以表示很多数值了。

根据以上的原理:我们可以给每一种组合赋予特定的含义,例如,可以分别用1101000、00011100、11111111、00000000、01010101、10101010来表示C、语、言、中、文、网这几个字,那么结合起来11010000001110011111111000000000101010110101010就表示”C语言中文网“。

但是在一般情况下我们不一个一个的使用元器件,而是将8个元器件看做一个单位,即使表示很小的数,例如1,也需要8个,也就是00000001。

所以在内存的思想中是没有abc这样的字符或者gif、jpg这样的图片的,只有0和1两个数字,计算机也只认识0和1。所以我们计算机只能使用二进制,而不是我们熟悉的十进制,所以被写入内存中的数据都会被转换成0和1的组合。