精讲数据在内存里的存储

思维导图
目录
一.数据类型
二.原码 ,反码,补码
三.大小端字节序列介绍
四.浮点类型数据的存储

思维导图:

前言:

不知道你们是否有这样的疑惑:数据是以什么形式存储在计算机里面的???

在读取数据的时候,又是以什么形式拿出来的???

我们都知道计算机只能识别机器语言(二进制语言:0,1的数字)

因为计算机中的数据都是以二进制数的形式来存储的。

不知道怎么转换 的老铁们,不要急哈~~

十进制数化二进制数

1.十进制数:10进制数  10  化成二进制数

十进制数化二进制的规则:除2取余

1.数据类型 
1.1基本类型(内置类型)

1.2构造类型

 对于构造类型而言,具体大小是多少取决于构造类型的成员

1.3unsigned char 与 signed char 存储数据的有效范围

对于char 而言又进行细分:unsigned char 与 signed char

unsigned char 存储数据有效范围:0~ 255

分析见下:

 signed char 存储数据有效范围:-127 ~ 127

分析见下:

1.4指针类型

1.5空类型

2.原码,反码,补码
对于任何一个数据在 内存里面存储的都是对应的 补码,但是读取出来的是原码的形式
原码,反码,补码 都是由符号位和数值位组成的;二进制序列的最高一位视为符号位,其余视为数值位
对于任何一个 正整数而言,对应的 原码,反码,补码都是相同的
对于 负整数来说:原码,反码,补码各不相同;对应规则如下:
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的 符号位不变 ,其他位依次按位取反就可以得到反码。
补码: 反码+1 就得到补码。
举个栗子吧~~~

-36的原码:100100B

反码 =  对应的原码的符号位不变,数值位按位取反  111011B

补码 = 对应的反码的符号位不变,反码 + 1                111100B

可能有的老铁会疑惑:为什么对于整形数据来说,在内存里面 存储的是补码???
对于这个原因只作为了解,知识补充哈~~~
在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀ 处理; 同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是 相同的,不需要额外的硬件电路
3.大小端字节序列的介绍
3.1基本介绍

通过调试 -->窗口 -->内存 --> 输入 &a 

可以看到a 对应的数据在内存里面存储的是:44332211

为什么倒着存储的呢??? 

这就不得不涉及到大小端字节序列存储的问题啦

当一个数据类型所占大小超过1字节之上(char  类型数据存储没有大小端之分),那么对应的内容存储在内存里面就涉及到大小端存放的问题,只不过,对于不同的编译器而言,到底是大端还是小端存储是不一样的。

⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存 在内存的低地址处。
⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存 在内存的⾼地址处。

对于VS而言:是小端存储模式

  此时低字节序列的内容01 放在了内存低地址处

3.2练习

1)

 当前代码输出是???

注意找亮点:数据类型不同;格式控制符是%d

分析如下:

主要是考察:%d  是以有符号10进制整形数据输出 ;无符号 char 提升为int 如何提升(高位补充0),有符号char 提升为int 如何提升(高位用符号位来补充)

运行结果:

2)

分析如下:

主要是考察:%u 是以无符号10进制整形数据输出 ;无符号 char 提升为int 如何提升(高位补充0)

运行结果:

3)

分析如下:

运行结果:

4)写一个程序,判断当前机器是大端还是小端模式

 首先需要知道大小端模式的定义;其次需要知道如何把一个数据转换为二进制

5)

分析见下:

结果:死循环

首先i 是一个无符号char 类型的数据,存储数据的有效范围是 0~255,当 i = 255 ,执行i++后i 又重新从 i = 0开始新的一轮循环,不断重复此过程,导致最终死循环

6)

分析见下:

7)

char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));

分析见下:

关于此部分内容你明白了没??? 

4.浮点类型数据的存储

浮点数包括的类型有:float,double,long double4.

4.1任何一个二进制数都可以用浮点数来表示

统一的表示方法:V = (-1)^S * M * 2^E

(-1)^S :表示符号位,所以S 的值非1即0

M 表示一个小数  1.xxxxxxx   

2^E 表示指数位

5.5 = 101.10B

      = 1.011 * 10 ^2

      = (-1)^0 *1.01*2^2   首先这个是个正数,所以S = 0

S = 0       M = 1.01    E = 2

对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M 对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

32位机器浮点数的存储方式

 64位机器的存储

4.2.浮点数存的过程

1)在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的 xxxxxx(小数)部分。注意:当不够23位,后面自动补0

⽐如保存1.01的时候,只把小数点后面的保存:01,等到读取的时候,再把第⼀位的1加上去。

2)如果在32位机器上(E 只存储8位),它的取值范围为0~255;如果在64位机器上(E 只存储位),它的取值范围为0~2047。但是,我 们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数,

对于32位机器,这个中间数是127

对于64位机器,这个中间数是1023

⽐如,2^10的E是 10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

3)浮点数取的过程:分3 种情况

正常情况:E不全为0或不全为1 

浮点数表⽰,即指数E的计算值减去127(或1023),得到真实值,再将有效 数字M前加上第⼀位的1。

E全为0 

浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第⼀位的1,⽽是还 原为0.xxxxxx的⼩数(M此时为0)。这样做是为了表⽰±0,以及接近于0的很⼩的数字

E全为1

如果有效数字M全为0,表⽰±⽆穷⼤(正负取决于符号位s)

4.3练习

分析:

运行结果:

 

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值