一.前言
个人简介:双非一本大数据在读
个人专栏:C语言知识学习
CSDN主页:Monodye
语句分享:祝大家新年快乐
今天带大家学习一下在内存中数据都是如何存储的主要从一下几个方面展开:
二.整数在内存中的存储
我们知道电脑在存放数据的时候,采用二进制存放,而二进制的表示方法有三种:
原码,补码,反码。
这三种表示方法,都有符号位(0代表负1代表正),数值位(转化位二进制的数)各不相同:
原码:将数据直接转化为二进制,存储起来。
补码:原码的符号位不变,其他位取反即可。
补码:在补码的基础上符号位不变,其他为取反后加一。
而计算机采用的是补码来存放数据,这是因为;
使用补码可以将符号位与数值位统一处理;
在计算的时候可以把减法当做减法进行计算;
补码转化为原码过程相同的,不需要额外的设备。
二.大小字节序,及其判断
运行并调试下面的程序,你能发现什么:
#include <stdio.h>
int main()
{
int a = 0x11223344;
return 0;
}
你会发现,在存储a的时候,内存是以字节为单位到着存储的,原因是计算机里存在一个东西叫:大小端。
2.1大小端
简单来说就是我们只要存放超过一个字节数据的时候,就会存在存储顺序的问题,根据不同的存储方式,分为大端和小端:
#include<stdio.h>
int mian()
{
int a=1;
char*p=(char*)&a;
if(*p==1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
根据p指针的值即可判断大小端问题。
2.2大小端字节序和字节序判断
判断电脑到底是大端还是小端存储,在某年的百度笔试题里还出过,所以大家一定要牢牢掌握。以下是代码的实现:
//代码1
#include <stdio.h>
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 类型。
那么浮点数到底是怎么存储的呢简单来说:浮点数在内存中是以二进制形式存储的具体的形式如下:
举个很简单的例子: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也有正负,所以规定
3.2理解代码
#include <stdio.h>
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;
}
运行结果:
这里带大家分析一下:
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.
好了,今天就分享到这里了,我们下次再见。