呀,数据原来是这样存储的,超详细!!!


前言

今天的文章介绍一下数据在电脑中的存储,大家一起来学习吧!!!


一、数据类型的分类

整形类型
1.short
包括unsigned short,signed short
2.int
包括unsigned int,signed int
3.long
包括unsigned long,signed long
4.char
包括unsigned char,signed char
unsigned 表示无符号类型,只能表示大于等于零的数
signed 表示有符号类型,可以表示负数最高位是符号位,如果最高位是1,则是负数,最高位为零则为正数
char的类型到底是unsigned char 还是signed char是由平台和编译器决定,而short,int,long默认都是带符号的整形
浮点型
1.float
2.double
3.long double

二、数据在内存中的存储

1.整型数据在内存中的存储

1.三种计算机二进制表示方法,原码,反码,补码\n\n原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码
-7的原码为10000000000000000000000000000111

7的原码为 00000000000000000000000000000111

反码:将原码的符号位不变,其他位次按位取反
-7的反码为111111111111111111111111111111111000

7的反码为 00000000000000000000000000000111

补码:反码符号位不变,数值为+1
-7的补码为111111111111111111111111111111111001

7的补码为 00000000000000000000000000000111

注意正数的原码,反码,补码一样,负数按上面的规则。

为什么计算机在存储数据用补码?
:补码是为了解决负数在计算机中的表示问题,最终是为了解决计算机的减法运算问题


2.浮点型数据在内存中的存储

在内存中,浮点数是以符号位、指数位、尾数位的顺序存储。
根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数可以表示成下面的形式:
(-1)^S * M * 2^E(即用科学计数法表示),float类型占四个字节,属于32位浮点数,最高的一位时符号位,中间的8位为指数位,后面的23位属于尾数位,其中S为符号位,E为指数位,M为尾数位。
double类型占八个字节,属于64位浮点数,最高的一位时符号位,中间的11位为指数位,后面的52属于尾数位,其中S为符号位,E为指数位,M为尾数位。
其中M的范围为1.0~2(2取不到),所以第一位一定是一,如果是32位浮点数,后面的23位可以不将1存入,则可以存入23位小数位,增加了精确度,如果将1存入,则只有22位去存小数位,取出的时候记得前面还有个1。

E的存入:
E为无符号整数,E如果是8位取值范围为0~255;E如果是11位取值范围为0-1023;
但科学计数法中的E是可以出现负数的。所以IEEE 754规定,存入内存时E的真实值必须加上一个中间值。对于8位的E,中间值位127。对于11位的E,中间值为1023。

E的取出:

E不全为0或不全为1\n\n减去中间值即可,对于8位的E,中间值位127。对于11位的E,中间值为1023。
E全为0:

E等于1-127(或者1-2023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.XXXXXXXXXX的小数,这样为了表示±0,以及接近于0的很小的数字。

E全为1:

取出为255减去中间值(127)=128,如果M趋于0,乘以2的128差不多趋于无穷,表示±无穷大

举例说明
5.5-十进制浮点数
写成二进制:101.1
所以:S=0;E=2;M=1.011 E+127 ;正数 所以 S=1;M不存前面的1,后面存入不够补0 ;
所以存入为:0100 0000 1011 0000 0000 0000 0000 0000
对应的十六进制是:0x 40 b0 00 00

在内存中中展示一下:
在这里插入图片描述
举例2:
-0.5——十进制浮点数
二进制:-0.1
S=1;E=-1;M=1.0
存入S:1 E+127:011 1111 0 M: 000 0000 0000 0000 0000 0000
最终为:
1011 1111 0000 0000 0000 0000 0000 0000
对应十六进制为:
0x b f 0 0 0 0 0 0
在内存中为:
在这里插入图片描述


3.大小端存储介绍

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
中;

小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地
址中。

三、重要举例:编程判断大小端

int check_Sys()
{
    
    
	int n = 1;//1的二进制补码中1在数据地位,将他的地址强转为字符型,每次就只能访问一个字节,如果拿到1,则说明1在地址低位存储为小端,否则在高位存储为大端
	return *((char*)&n);
}
int main()
{
    
    
	if (check_Sys)
	{
    
    
		printf("小端!\n");
	}
	else
	{
    
    
		printf("大端!\n");
	}
	return 0;
}

1的二进制补码中1在数据地位,将他的地址强转为字符型,每次就只能访问一个字节,如果拿到1,则说明1在地址低位存储为小端,否则在高位存储为大端

运行展示:
在这里插入图片描述
作者的电脑为小端存储!!!

总结

今天的分享就结束了,希望可以帮助到大家,谢谢观看学习!!!

猜你喜欢

转载自blog.csdn.net/m0_71214261/article/details/132119684
今日推荐