关于32位和64位、地址线、内存单元、字节等知识汇总

发布于:2022-11-03 ⋅ 阅读:(383) ⋅ 点赞:(0)

        学习C一段时间了,一些学习初期的遗留问题终于在不断实验和调试之后得到了答案,在恍然大悟和欣喜若狂之余,为防止知识的诅咒,赶紧提笔记录下来,希望给刚入门的朋友一些参考;如果有幸被前辈们看到这篇文章,也请多批评指正。

        按照标题相反的顺序:
        1.计算机是由0和1组成的,一个(1/0)就是一个比特位,一个字节等于八比特,即1byte=8bit;

        2.计算机的内存由内存单元组成,每个内存单元的大小为8bit,即一个字节;

        3.如果给你32盏排成一排的灯,对应有32个开关由你掌控,你能玩出多少种不同亮灭的花样呢?根据排列组合,应该是2^32个;同理64盏灯应该 有2^64种花样;

        4.关于16进制和2进制,16进制的一位数需要2进制的四位来表示;

        5."int a=0x11223344;"这段代码表达的意思是:在内存中开辟了4个字节用来存放整形变量a,并给其赋值为一个16进制数:11223344,这个数转换成2进制的话应该是由8*4=32个0或1组成(由第4点可知),而32bit=4byte,即4个字节。

        上述5点就是读这篇文章需要准备的全部知识了,因为是新手向的,所以字符、字、字长以及kb、mb等的换算之类的没有拓展,下面我们进入正题。

        以32位机器为例,如果有32根地址线,每根地址线能产生(1/0)的电信号,那么32根地址线所产生的地址如下图黄色区域:(类比上述第3点)

       这样一来,我们就有了2^32个内存单元,并且每个单元都有了与之对应的唯一编号,也就是我们常说的地址(2进制);而在编译软件中(以Visual Studio 2022为例)这些编号是以16进制的数表示的,我们刚说16进制的一位数需要2进制的四位来表示(上述第4点),那么我们可以推断:

1.地址:这32个0或1(2进制)在编译器里应该是8位的16进制数

2.内存单元:8bit即8个0或1(2进制)由16进制数表示应该是2位

       而事实证明的确如此。以这段代码为例:

#include <stdio.h>

int main()
{
	int a = 0x11223344;
	int* pa = &a;

	return 0;
}

        F10调试让代码跑起来,从窗口中打开内存和监视:

        我们可以看到a这个变量的值的的确确被放进了一个以编号为"0x001DFEA0"为首的四个字节里面了,没错我说的是为首,这一点需要注意。我们的继续看,如果我们用下面一行的内存单元编号"001DFECB"减去"0x001DFEA0"会得到什么呢?

        答案是43(10进制),这时候如果你还没有眼花并且也很清醒的话,你数一下调试界面那张图内存每一行字节的个数,的的确确就是43个。

        当我走到这一步的时候,我深刻理解到了醍醐灌顶的滋味,一口气写下这篇文章,感觉天晴了,花香了,虽然我知道我了解的这些只是一些皮毛,但的确是困扰了我很久的问题,我之前以为内存单元里放了32个0(误 ,这也是我写的第一篇文章,希望能给你带来一些帮助。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到