Java教程

数据在内存中的存储

本文主要是介绍数据在内存中的存储,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

数据在内存中的存储

    • 可能用到的知识(大佬直接跳过)
    • 整形数据的存储
    • 浮点型数据在内存中的存储

可能用到的知识(大佬直接跳过)

vs(visual studio)编译器中,内存窗口打开方式及介绍
1、进入调试状态
2、点击调试按钮
3、划入窗口,找到内存,4个窗口等价,凭借喜好点开一个
在这里插入图片描述

打开内存窗口后就会有如下界面:
在这里插入图片描述
其中左边的部分代表地址
地址
这些16进制的数字就是内存的地址了
中间的是用16进制数字的形式表示的内存中的数据
对比放置
(之所以用16进制显示,可能是因为比较整齐,便于使用者,但是在存储的时候是按照2进制存储的)
为了方便大家观看,这张图把左边的地址也截了下来,这张图里左边的地址指向每一行第一个元素
而右侧的是以字符形式展示的内存,跟中间的意义一样,为了方便查看内存中的字符而存在
以字符的形式展示内存

整形数据的存储

1、字节序

整形数据在内存中的存储,比如 int 类型占有4个字节,当我们创建一个int 变量的后,运行程序,就会有一块专门的内存来存放这个数据,这里为用vs编译器的调试功能内存窗口展示给大家,如下:

	//例如我们可以创建一个整形变量a,初始化为10
	int a = 10;

我们可以直接在内存窗口中搜索我们刚刚创建的变量a
寻找a的地址
在地址一栏中,我们可以输入要查找的地址,可以直接输入地址,也可以输入表达式,比如&a即为变量a的地址
我们可以看到a中的值是 0a 00 00 00(4个字节,每个字节一共8个bit位,恰好是每两个空格之间代表一个字节)
第一个字节里的内容是 0a,翻译成10进制就是10,
其余字节里都是0。

这就是我们在a 中存储的数据,可以看到,它在存储的时候是:存储是以字节为单位的,同时排在前面的字节存储较低位的数据的,

这种 “排在前面的字节存储较低位的数据” 的存储方式,我们叫它“小端序”
同理,如果“排在前面的字节存储较高位的数据”叫“大端序”
大家可以看到,我的电脑是小端序的存储方式
文字毕竟啃得不是很舒服,来操作一下

	//为了更加直观,我们直接存16进制的数字
	int b = 0x11223344;
	int c = 0x55667788;

开始调试!

这是b
&b
这是c
&c
再来一个d吧?
为了证明是以字节为单位的,我们让d这样

int d = 0x12345678;

调试!

&d
果然,结果是 78 56 34 12

除了存储外,我们的电脑需要通过网络接收以及发送数据,这个接收和发送的方式都是大端序的。

2、补码

在上面的基础上,我们加一行代码:

int e = -1;

然后调试,结果如下:

补码的引入
???
按照16进制的数字翻译过来这显然是一个很大的数字啊,怎么就是-1了?
这个就要跟我们的补码联系起来了

因为,数据在内存中是以补码的形式来储存的
这里有两点要说
1.正数整形的补码为自身
2.负数整形的补码为对应的二进制数字按位取反,再加一
这样以来,是不是就解释通了?

那么为什么要这样,
为了计算方便,在我们的电脑上有一个加法器,用来实现加法运算,而减法也是用加法器完成的,然而为什么不直接设计个减法器呢?,因为硬件设备的成本要比软件程序高,为了减少硬件成本,我们就在软件上下功夫,于是有了补码。补码的存在可以让加法器计算减法,甚至乘法和除法。

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

1、存储方式:科学计数法
float类型的浮点数4个字节一共32个bit位分配如下:
第1个,符号
2~9,整数
10~32,2的E次方

而double类型有64个bit位:
第1个符号
2~12,整数
13~64,2的E次方

可以通过代码测试:

	float f = 21.3;
	double g = 21.345;

这样,
f如下
&f
g如下:
&g
不过一般来说,浮点型是不够精确的,我们可以举个例子,这里打开Python示范一下
如下:

浮点型的不精确实验
可以看到,浮点型并没有给出一个理想中的数字,所以我们在计算的时候并不优先考虑浮点型

这篇关于数据在内存中的存储的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!