数据在内存中的存储

一.前言 

个人简介双非一本大数据在读

个人专栏:C语言知识学习

CSDN主页:Monodye

语句分享:祝大家新年快乐

今天带大家学习一下在内存中数据都是如何存储的主要从一下几个方面展开:

1. 整数在内存中的存储
2. ⼤⼩端字节序和字节序判断
3. 浮点数在内存中的存储

 二.整数在内存中的存储

我们知道电脑在存放数据的时候,采用二进制存放,而二进制的表示方法有三种:

原码,补码,反码。

这三种表示方法,都有符号位(0代表负1代表正),数值位(转化位二进制的数)各不相同:

原码:将数据直接转化为二进制,存储起来。

补码:原码的符号位不变,其他位取反即可。

补码:在补码的基础上符号位不变,其他为取反后加一

而计算机采用的是补码来存放数据,这是因为;

使用补码可以将符号位与数值位统一处理;

在计算的时候可以把减法当做减法进行计算;

补码转化为原码过程相同的,不需要额外的设备。

二.大小字节序,及其判断

运行并调试下面的程序,你能发现什么:

#include 
int main()
{
 int a = 0x11223344;
 
 return 0;
}

你会发现,在存储a的时候,内存是以字节为单位到着存储的,原因是计算机里存在一个东西叫:大小端。 

2.1大小端

简单来说就是我们只要存放超过一个字节数据的时候,就会存在存储顺序的问题,根据不同的存储方式,分为大端和小端:

⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存
在内存的低地址处。
⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存
在内存的⾼地址处。
那么如何判断自己的计算机是大端还是小端呢,根据大小端的定义我写了下面一段程序:
#include
int mian()
{
int a=1;
char*p=(char*)&a;
if(*p==1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
   return 0;
}

根据p指针的值即可判断大小端问题。

2.2大小端字节序和字节序判断

判断电脑到底是大端还是小端存储,在某年的百度笔试题里还出过,所以大家一定要牢牢掌握。
以下是代码的实现:
//代码1
#include 
int check_sys()
{
 int i = 1;
 return (*(char *)&i);
}
int main()
{
 int ret = check_sys();
 if(ret == 1)
 {
 printf("⼩端\n");
 }
 else
 {
 printf("⼤端\n");
 }
 return 0;
}

分析如下:

三.浮点数的存储

3.1存储的形式

我们常见的浮点数有float、double、long double 类型。

那么浮点数到底是怎么存储的呢简单来说:浮点数在内存中是以二进制形式存储的具体的形式如下:

数据在内存中的存储_第1张图片

 举个很简单的例子:5.0转化为二进制101.0则他在内存中存储的时候,S=0,M=1.01,E=2*2,

而-5.0即-101.0,S=1,M=1.01,E=2*2,所有的浮点数都是这样存储的。

有时由于M总是大于等于1的所以我们可以省略1,取的时候在加上1就好了,这样节省了内存,可以存储更大的有效数字。

由于浮点数存储时的E也有正负,所以规定 

如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047(取决于编译器)。存⼊内存时E的真实值必须再加上 ⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。⽐如,2^10的E是 10,所以保存成32位浮点数时,必须保存10+127=137,即10001001

3.2理解代码

#include 
int main()
{
 int n = 9;
 float *pFloat = (float *)&n;
 printf("n的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 *pFloat = 9.0;
 printf("num的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 return 0;
}

运行结果:

数据在内存中的存储_第2张图片

这里带大家分析一下:

9为整形,在内存中存储为0000 0000 0000 0000 0000 0000 0000 1001

如果以二进制取出的话S=0,M=000 0000 0000 0000 0000 1001,E==00000000,E全为零,那么这个数将无限接近于0,所以1的结果为0

9.0为浮点数它在内存中存储为1001.0 

S=0,E=3+127=130,M等于001后面补0够23位

最后的二进制为0 10000010 001 0000 0000 0000 0000 0000

把它当作整数时则为整数的补码,转化成整数即1091567616.

好了,今天就分享到这里了,我们下次再见。

数据在内存中的存储_第3张图片

你可能感兴趣的:(dubbo)