整数和浮点数在内存中的存储(c语言进阶)

数据在内存中如何存储(c语言进阶)

  • 前言
  • 一、整形在内存中的存储:原码、反码、补码
    • 大小端的介绍
  • 三、浮点型在内存中的存储解析


前言

本系列博文仅为博主个人学习笔记,通过博客理清学习思路用于复习。如有记述不周到的地方请谅解;如能指出,更加感谢。

一、整形在内存中的存储:原码、反码、补码

变量的创建是要在内存中开辟空间的,空间的大小是根据不同的数据类型而决定的。

那接下来我们来讨论一下数据在开辟内存中到底是如何存储的?

比如:

int a = 20 ;
int b = -10;

首先int类型的数据在内存中占4个字节, 那a , b 都是int类型,分析如何在内存中
存储 :在此之前我们需要了解这三个概念:
计算机中的有符号数有三种表示方法,即原码,反码,补码。
三种表示方法均有符号位数值位两部分,符号位都是用‘0’表示正,
用‘1’表示负,而数值位三种表示方法各不相同。

原码
直接将二进制按照正负数的形式翻译成二进制即可
反码
在原码的基础上,符号位不变,其他位按位取反即可
补码
又在反码的基础加1即可

补码转原码常用的转换方法有两种:
	1.减1之后,符号位不变,其他位按位取反
	2.符号位不变,其他位按位取反,再加1

例:已知-1 补码,如何得到其原码
整数和浮点数在内存中的存储(c语言进阶)_第1张图片
正数的原码 、反码、补码都相同。
那计算机中到底存的是哪种表达形式呢? 答 :是补码

为什么呢?

在计算机中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域
统一处理;同时,加法和减法也可以统一处理(CPU只有加法器),此外,补码与原码相互
转换, 其运算过程是相同的,不需要额外的硬件电路。

知道数值在内存中的表示形式之后来验证一下,是否是正确的。

int a = 10 ;
int b = -20 ;
// 10 是正数,故其原码就是它的补码
// -20 是负数,需要将原码进行转换成补码

整数和浮点数在内存中的存储(c语言进阶)_第2张图片

整数和浮点数在内存中的存储(c语言进阶)_第3张图片
这里我们可以看到对于a 和 b分别存储的是补码,但是我们发现顺序有点不对劲,这是为什么呢 ?

大小端的介绍

大端(存储)模式:把一个数据的低位字节内容,存放在高地址处;
高位字节内容,存放在低地址处。
小端(存储)模式:把一个数据的高位字节内容,存放在高地址处;低位字节内容,存放在低地址处。

整数和浮点数在内存中的存储(c语言进阶)_第4张图片

三、浮点型在内存中的存储解析

根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面的形式:

  • (-1)S * M * 2E
  • (-1)S表示符号位,当S=0时,V为正数;当S=1时,V为负数。
  • M表示有效数字,大于等于1,小于2。
  • 2 E表示指数位。
    整数和浮点数在内存中的存储(c语言进阶)_第5张图片

关于M:
前面说过1<=M<2,所以M总是可以写成1.xxxxxx的形式,其中xxxxxx为小数部分。
IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保留后面的xxxxxx部分。比如保存1.01时,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省一位有效数字。
关于E:
首先E为一个无符号整数(unsigned int),这意味着,如果E为8位,它的取值范围为0 ~2 55。如果E为11位,它的取值范围为0 ~ 2047。但是我们知道,科学计数法中的E是可以为负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如210,的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。
此外,指数E从内存中取出还可以分成三种情况。
E不全为0且不全为1
这时,浮点数就采用下面的规则表示,即指数E的计算值加上127(或1023),得到真实值,再将有效数字M前加上第一位的1。
E为全0
这时,浮点数的指数E等于1-127(或者1-1023)即为真实值, 有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
E为全1
这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)。

你可能感兴趣的:(计算机语言,编程语言)