数据存储(Po累Po累)

目录

数据类型简介

数据存储(整型+浮点型)

整型存储

大小端

浮点型存储

实践练习



今天我们来了解一下数据在内存中是如何存储的

看看下面的代码可以算出结果嘛,如果不确定或是有不会的就请看完这篇博客,相信对你有不少帮助

数据存储(Po累Po累)_第1张图片

数据类型简介

char        //字符数据类型  1字节
short       //短整型       2字节
int         //整形         4字节
long        //长整型       4字节
long long   //更长的整形    8字节
float       //单精度浮点数  4字节
double      //双精度浮点数  8字节

注意在C语言中没有字符串类型,字符串是由char类型的数组定义的

类型的意义:
1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)
2. 如何看待内存空间的视角

数据存储(整型+浮点型)

我们知道一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的,我们接着看看数据是如何在内存中开辟空间存储的

整型存储

数据存储(Po累Po累)_第2张图片

a为什么是按照这样在内存中存储的呢

这时我们就要先介绍一下整型在内存中是如何存储的

计算机中整型数据有三种表示方式 原码 补码 反码

正数:正数的原、反、补码都相同

负数:负数的三种表示形式不同

  原码 ——>符号位不变其他位按位取反——>反码——>+1——>补码

整型数据在内存中都是以补码方式存储的

数据存储(Po累Po累)_第3张图片知道了原反补的知识我们发现还是不能解释数据的存储

数据存储(Po累Po累)_第4张图片

数据存储(Po累Po累)_第5张图片

 我们发现存储的顺序好像是反的这是为什么呢?

这时就要了解大小端知识了

大小端

大端存储 :是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
小端存储 :是指数据的低位保存在内存的低地址中,而数据的高位, ,保存在内存的高地
址中

为什么存在大小端呢

因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为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 ,小于 2
2^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
数据存储(Po累Po累)_第6张图片
对于 64 位的浮点数,最高的 1 位是符号位S,接着的 11 位是指数 E ,剩下的 52 位为有效数字 M
  数据存储(Po累Po累)_第7张图片
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)

实践练习

掌握了浮点数存储规则我们就可以解决最开始的问题了 我们先看下结果在分析
数据存储(Po累Po累)_第8张图片

数据存储(Po累Po累)_第9张图片

 以上就是关于数据在内存中的存储,相信看到了这里就会对于数据存储有更深的理解,同时如果看着觉得不错的还请点赞评论!Po累Po累!!!

你可能感兴趣的:(C语言,c语言)