目录
今天我们来了解一下数据在内存中是如何存储的
看看下面的代码可以算出结果嘛,如果不确定或是有不会的就请看完这篇博客,相信对你有不少帮助
数据类型简介
char //字符数据类型 1字节
short //短整型 2字节
int //整形 4字节
long //长整型 4字节
long long //更长的整形 8字节
float //单精度浮点数 4字节
double //双精度浮点数 8字节
注意在C语言中没有字符串类型,字符串是由char类型的数组定义的
类型的意义:
1.
使用这个类型开辟内存空间的大小(大小决定了使用范围)
2.
如何看待内存空间的视角
数据存储(整型+浮点型)
我们知道一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的,我们接着看看数据是如何在内存中开辟空间存储的
整型存储
a为什么是按照这样在内存中存储的呢
这时我们就要先介绍一下整型在内存中是如何存储的
计算机中整型数据有三种表示方式 原码 补码 反码
正数:正数的原、反、补码都相同
负数:负数的三种表示形式不同
原码 ——>符号位不变其他位按位取反——>反码——>+1——>补码
整型数据在内存中都是以补码方式存储的
知道了原反补的知识我们发现还是不能解释数据的存储
我们发现存储的顺序好像是反的这是为什么呢?
这时就要了解大小端知识了
大小端
大端存储
:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
中
小端存储
:是指数据的低位保存在内存的低地址中,而数据的高位,
,保存在内存的高地
址中
为什么存在大小端呢
因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit 对于大于一字节的类型存储方式就会有多种方式,每种存储又没有否定的理由所以出现了大端存储和小端存储(大部分计算机小端储存)
知道这些我们来看看一道面试题来加深对于大小端的理解
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序
我们来试试实现代码
int check_sys()
{
int i = 1;
return (*(char *)&i);//访问1的首字节判断是否是小端存储
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
相信了解了大小端代码更加加深对于整型在内存中的存储
浮点型存储
常见的浮点数:
3.14159 1E10
浮点数家族包括:
float
、
double
、
long double
类型
首先了解一下浮点数存储规则吧 根据国际标准
IEEE
(电气和电子工程协会)
754规定
(-1)^S * M * 2^E(-1)^s 表示符号位,当 s=0 , V 为正数;当 s=1 , V 为负数M 表示有效数字,大于等于 1 ,小于 22^E 表示指数位
举个栗子
float a = 5.5f;
5.5中整数5(十进制)可以转换为101(二进制)而0.5二进制为.1
5.5(十进制)—>101.1(二进制)
将公式带入
S=0 M=1.011 E=2
准备工作完成了接着就是存储了
IEEE 754
规定:
对于
32
位的浮点数,最高的
1
位是符号位
s
,接着的
8
位是指数
E
,剩下的
23
位为有效数字
M
![](https://i-blog.csdnimg.cn/blog_migrate/2b879166ec7a9f7cdbb940cec348a93f.png)
对于
64
位的浮点数,最高的
1
位是符号位S,接着的
11
位是指数
E
,剩下的
52
位为有效数字
M
![](https://i-blog.csdnimg.cn/blog_migrate/e24f948d9e806454f972eb9b05b48d4c.png)
IEEE 754
对有效数字
M
和指数
E
,还有一些特别规定
M
可以写成
1.xxxxxx
的形式,其中
xxxxxx
表示小数部分。计算机默认这个数的第一位总是1,因此可以被舍去,只保存后面的 xxxxxx部分
至于指数
E
,情况就比较复杂。
E
为一个无符号整数(+127 +1023)
如果
E
为
8
位,它的取值范围为
0~255
;如果
E
为
11
位,它的取值范围为
0~2047
。科学计数法中的E
是可以出现负数的,所以IEEE 754
规定,存入内存时
E
的真实值必须再加上一个中间数,对于
8
位的
E
,这个中间数是127
;对于
11
位的
E
,这个中间 数是1023
E
不全为
0
或不全为
1
指数
E
的计算值减去
127(或1023
),得到真实值,再将 有效数字M
前加上第一位的
1
E全为0 (无限接近于0的数字)
有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数
E
全为
1(正负无穷大)
这时,如果有效数字
M
全为
0
,表示
±无穷大
(正负取决于符号位
s)
实践练习
掌握了浮点数存储规则我们就可以解决最开始的问题了 我们先看下结果在分析
![](https://i-blog.csdnimg.cn/blog_migrate/a6da64e371111829afdc8b03a062a651.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e34a10ca9775e3a7a27925c4d82c3316.png)
以上就是关于数据在内存中的存储,相信看到了这里就会对于数据存储有更深的理解,同时如果看着觉得不错的还请点赞评论!Po累Po累!!!