csapp 信息存储

信息在计算机系统内是如何存储的

通常情况下,程序将内存视为一个非常大的数组,数组的元素是由一个个的字节组成,每个字节都由一个唯一的数字来表示,我们称为地址,这些所有的地址的集合就称为虚拟地址空间。
在这里插入图片描述

字节

是信息存储的基本单元。
一个字节是由8个位组成,在二进制表示法中,每一个位的值可能有两种状态,0或者1。如果用十进制来表示,那么一个字节的取值范围就在0~255之间,我们把这种按照一位一位表示数据的方式称为位模式。使用二进制表示法比较冗长,而十进制表示法与位模式之间的转换有比较麻烦。因此,我们引入十六进制数来表示位模式。
在C语言中,十六进制数是以0x/0X开头。
在这里插入图片描述

进制转换

在这里插入图片描述
小技巧:记住十六进制 A C F所对应的十进制数,其他的加减一下就得到了。

十六进制与二进制

在这里插入图片描述

2的N次方的数如何快速的转成二进制数

在这里插入图片描述
在这里插入图片描述

Words

字长决定了虚拟地址空间的最大值可以到多少,也就是说,对于一个字长为w位的机器,虚拟地址的范围是0到2^w - 1。近些年,高性能服务器,个人电脑以及智能手机已经完成了从32位字长到64位字长迁移。不过在一些嵌入式的应用场景中,32位的机器仍旧占有一席之地,对于32位的机器,虚拟地址空间最大为4GB,而64位的机器,虚拟地址空间最大为16EB。在这里插入图片描述
在迁移的过程中,大多数64位的机器做了向后兼容,因此为32位机器编译的程序也可以运行在64位机器上,可以通过下图的命令编译生成可以在32位机器上运行的程序。通过修改编译选项,就可以编译生成在64位机器上运行的程序。在这里插入图片描述
hello32可以运行在32位和64位机器上,但是hello64只能运行在64位的机器上。对于32位程序和64位程序,主要的区别还是在于程序是如何编译的,而不是运行机器的类别,C语言中,支持整数和浮点数多种数据格式,要记住下面这个表:
在这里插入图片描述
对于我们需要存储的数据,我们需要搞清楚该数据的地址是什么,以及数据在内存中是如何排布的。下面我们通过一个例子来说明一下。
例如,一个int类型的变量x(0x01234567),假设地址位于0x100处,由于int类型占4个字节,因此变量x被存储在地址为0x100,0x101,0x102,0x103的内存处。
存储方式有大端和小端法
大端法
最高有效字节存储在最前面,也就是低地址处
小端法
最低有效字节存储在最前面,也就是高地址处
对于我们的变量x,最高有效字节是0x01,最低有效字节是0x67
大多数Intel兼容机采用小端模式,IBM和Sun公司的机器大多数采用大端法。对于很多新的处理器,支持双端法,可以配置成大端或者小端运行,例如基于ARM架构的处理器,支持双端法。但是Android系统和iOS系统却只能运行在小端模式。
深入理解计算机系统的原书中,分别在以下4种不同的机器进行了程序测试。
1.运行linux系统,字长为32位的机器。
2.字长为32位的机器,操作系统是windows。
3.SUN是大端法机器
4.linux系统,字长为64位的机器
在这里插入图片描述
通过在这4种不同的机器上运行字节打印程序,可以打印输出程序对象的字节表示,其中这个强制类型转换告诉编译器,程序应该把这个指针看成指向一个字节的序列,而不是这个对象原始的数据类型。

具体的运行结果如图所示,12345的十六进制表示为0x00003039,除了字节顺序之外,在所有机器上都得到了相同的结果。在这里插入图片描述
由于不同操作系统使用不同的存储分配规则,指针的值是完全不同的,32位的机器,使用4字节的地址,64位的机器使用8字节的地址。
在这里插入图片描述
虽然整型和浮点数都是对数值12345进行编码,但是它们却有着完全不同的字节模式。
在这里插入图片描述
如果我们用二进制的形式表示,然后进行适当的移位,我们就会发现有一个13位的匹配序列,这是不是一个巧合呢?九曲阑干说晚点告诉你

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榆钱不知秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值