在写代码时,我们会碰到把一个数据类型输出的时候,得到的结果与我们输入不同的情况,这往往是我们在输出时用了别的类型的输出方式,或者在数据存入的时候因为计算机的问题无法完整保存。下面就讲讲c语言中整型与浮点型数据在内存中是如何存储的。
一、整型
首先,整型在内存中是以整数的补码存储的(原码,反码,补码这里就不多说了),然后存入数据总得有一个顺序,其实这个存储顺序可以我们想怎么存就怎么存,只要我们怎么存进去就怎么拿出来就行了。但是呢,总不能每个编译器都有它自己的一套复杂的存储方式吧,这就太麻烦了。所以编译器的整型一般都采用两种存储方式,一个是大端字节序存储,一个是小端字节序存储。接下来就讲讲什么是大小端字节序存储。
1.小端字节序存储
这里我们就用十六进制表示一个整数来看看,为什么要用十六进制?因为在调试时,内存中的数据会以十六进制的形式展示出来,要是以二进制的样子显示就太长了,也看不懂。
首先呢,n 这个十六进制整数用二进制表示出来是这样的:
因为一个字节有 8 个 bit 的空间,一个整型占 4 个字节, 也就是分成这样:
所谓字节序呢,也就是一个字节一个字节的分开,再把字节按顺序存放。
我们在内存窗口中可以看到,在 vs 里面,把数字的低位的字节放在里地址较低的地方,也就是看起来和我们写的是反过来的,这就是小端字节序存储。
2.大端字节序存储
既然已经讲了小端字节序存储,那么大端字节序存储就很简单了。就是在内存中和我们写的看起来一样,这就是大端字节序存储了。(就不举例子了)
3.写个程序判断编译器的整型存储方式
我们只要写一个整型 1 ,然后把地址拿来用 char 类型把地址刚开始的那个字节的内容给拿出来,就可以轻松的判断出我们的编译器用的是大端存储还是小端存储了。
二、浮点型
这里我们先看一段代码:
同样的地址,用不同的方式取出来,显示的结果却相去甚远,这就是数据的存储方式不同照成的,不同的数据有不同的存储方法,取出的方法也不同,所以用错误的方法去取数据,结果就会有问题。
那么浮点数的存储方式是怎样的呢?下面就来简单的说一下,就大概的讲一下它的存储方式。
根据规定,每一个浮点数都可以表示为一下形式
以下是引用来的:
然后,根据机器的不同,内存中会用一定位 bit 的空间来存储 S,M 和 E ,这样就可以达到存储浮点数的目的了。
其中32位的机器,1 个 bit 用来存放 S, 8个 bit 用来存放 E ,剩余的 23 个 bit 来存放 M, 而64位机器的 S, E, M 则分别是 1,11,52个bit。
至于S,E,M 具体是怎么存储的,这里就不多赘述了,浮点数的存储就大体的介绍到这里。
到这里我们的数据类型在内存中的存储的讲解也就结束了。最后希望别忘了点赞收藏加关注!!!(●'◡'●)