理解int的存储方式以及VS二进制编辑器的使用

  此文先讲int数据的存储(大小端)问题,然后简单讲一下二进制编辑器的使用,针对像我一样的初学者,懂了的大神可以直接关掉

       直接说结论,大家都知道一个int数据是4字节,一个字节是8个比特位,也就是一个int类型占了4*8=32个比特位,这也就是int类型范围的由来。一个内存地址对应的空间就是一个字节,一个int数据会对应四块连续的内存空间,接下来用数字1来说明,要存储int类型数字1,那么在这32个比特位中只有一个是1,其余都是0。结论:这个1是存储在第一块内存空间里的,也就是说,这四块内存空间依次是

00000001  00000000  00000000  00000000

,这个1其实并不是在最后,(也就是数据高位存储在内存地址大的地方),同理256存储的方式是

00000000  00000001  00000000  00000000

,先理解这种存储方式就好了,后面会用二进制编辑器来验证。

我们先用代码来创建一个存有一个int数字的文件,代码如下:

    #include<cstdio>
     
    int main() {
        int n = 1;
        FILE *f = fopen("test", "wb+");
        fwrite(&n, 4, 1, f);
        fclose(f);
        return 0;
    }

 (  这里是C++,C语言的话把第一行换成stdio.h应该就行了)这几个函数可以搜一下,此段代码的作用就是创建了一个名为test的文件,写入了一个int数字1。如果无法创建也可以往下看,不影响
此时会在工程目录下生成一个名为test的文件,此文件没有后缀名,可以右键看一下属性,是占用了4字节,刚好是一个int的大小,如果你用记事本打开,会看到不是一个正常的字符。这里代码写入的1实际是ascii码,如果代码用n=49,即可用记事本看到数字1。我们用n=1继续。接下来我们用二进制编辑器来打开它。

        此处用vs2017自带的二进制编辑器,打开方式为“文件->打开->文件”,到了选择文件的窗口,选择刚才创建的test文件,可以看到打开按钮旁边有个三角箭头,点一下,如图(我这里的vs是英文),中文可能是“打开为”

打开方式选择二进制(我这里英文是Binary Editor,中文版自己看一下是哪个。。)

  会看到如下图

        先介绍一下,前面连续的8个0是地址,可以先简单地理解成行号,或者直接忽视掉也可以,然后后面是

01  00  00  00

        这里第一个01就是对应前面所说的第一块内存空间,就是1存在int的第一个字节中,可是这里只看到了两位,不是应该有8位吗?实际上这里是以十六进制显示的,8个比特位就是2的8次方,刚好与这里的两个16进制,也就是16*16相等,估计没人想对着一堆0和1修改(我理解的也就是二进制编辑器用起来实际为十六进制编辑器...)。可以看到后面有四个点,这四个点对应的就是这四个字节所存储的数字ascii码所对应的字符,有点绕,因为这里目前只有0和1,ascii码对应的字符不能显示,只好显示了小点,也就是说,如果把第一个01改为十进制的49,右边的第一个点就可以显示出来字符‘1’,但是不要忘记这里是十六进制,所以应该把49换算成十六进制,也就是十六进制的31,修改好后如下图,右边顺利显示出来了‘1’:(修改有难度,多摸索几次找规律)

        接下来尝试修改成下图所示:

     这里对应的十进制数值应该是2的8次方也就是256,然后点击保存,此时test文件里存储的是int类型数字256,大小依然4字节,注意这里说是int类型是因为可以这样理解,并不是指文件里面存的就是一个int,文件里只不过是存了8*4=32个比特位而已,所以我们同样可以理解成存了4个char类型数据,或者两个short类型数据。如果把上面数据后面两个字节删掉,如下图所示:

 此时可以看到只剩下了两个字节的数据(那个竖线是光标),右边的点也只变成了两个,此时保存,你会发现test文件大小变成了两字节。

        最后额外说一点txt文件吧,新建一个空的txt文件,是0字节,打一个数字1,文件是1字节。在这里输入进去的实际是一个字符‘1’,对应的ascii码是49,用二进制编辑器打开这个文件,发现是下图,

      十六进制的31对应的十进制刚好是49,ascii码刚好对应字符‘1’。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值