![420b5cf48ffac39216938282fde0f88b.png](https://i-blog.csdnimg.cn/blog_migrate/35e6e20d18487368b99fe6d47b1322b4.jpeg)
前言:
因为深入理解计算机系统里的这一章篇幅较长,知识点较多,故分为两次来写。
正文:
我们知道现代计算机系统中,是用二进制数字存储和处理信息的。
为什么要用二进制呢?
因为二值信号有几个优点:容易被表示、存储和传输,用二值信号存储和执行计算的电子电路简单且可靠。存储一位信息或一个数字值比存储一个模拟值要容易的多。下面,我们就来探讨二值信号是怎样来存储和处理信息的。
首先,来回忆一下几个有用的概念:位、字节、字、KB、MB
位:“位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1。
字节:8个二进制位构成1个“字节(Byte)”,它是存储空间的基本计量单位,作为最小的可寻址的内存单位。1个字节可以储存1个英文字母或者半个汉字,换句话说:1个汉字占据2个字节的存储空间。
一个字节表示的范围:
Binary: 00000000 to 11111111
Decimal: 0 to 255
Hexadecimal: 00 to FF
字:“字”由若干个字节构成,字的位数叫做字长,不同档次的机器有不同的字长。例如一台8位计算机,它的1个字就等于1个字节,字长为8位。如果是一台16位计算机,那么,它的1个字就由2个字节构成,字长为16位。字是计算机进行数据处理和运算的单位。
KB:K表示1024,也就是2的10次方。1KB表示1K个Byte,也就是1024个字节。
1、信息存储
机器级程序会将内存视为一个非常大的字节数组,称为虚拟内存。
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
使用虚拟内存的优点:
(1)程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区。
(2)程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应 量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页 会根据需要在物理内存与磁盘之间移动。
(3)不同进程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
![fd417e8688d59904be08f7ea00f0f739.png](https://i-blog.csdnimg.cn/blog_migrate/9d3609cb135913f82e7d91babcaa27be.jpeg)
内存中的每个字节都由唯一的数字来标识,称为它的地址,所有可能地址的集合被称为虚拟地址空间(进程可用的虚拟地址范围),是一个机器语言层面的抽象概念。从每个进程的角度来看,内存中只存在操作系统内核及本进程,即内存是被本进程独占的。前面提到的字长决定了虚拟地址空间的最大大小,对于一个w位的机器而言,它的虚拟地址范围为0~
像对程序数据、指令和控制信息等存储位置的分配和管理都是在虚拟地址空间里完成的。
举个栗子:
![095bf6af717a766d84166a9008dc7a7f.png](https://i-blog.csdnimg.cn/blog_migrate/ae09b460885e7e5e2456386b401d4b01.jpeg)
C语言中一个指针的值是某个存储块的第一个字节的虚拟地址。每个程序对象可以简单地视为一个字节块,而程序本身就是一个字节序列。
接下来,我们来了解下位模式相关知识?
简单来说,单个的位不是很有用,但是把位组合在一起,再赋予不同含义的位模式,就能够表示任何有限集合的元素。
在二进制表示法中,一个字节(8位)的值域是00000000~11111111,而十进制表示法就是0~255。但是,二进制有些冗长,十进制与位模式的相互转化又很麻烦,较好的方式是使用十六进制来表示位模式。
![03363e9cf52a6b0b37d1581a6e3a2a41.png](https://i-blog.csdnimg.cn/blog_migrate/449d36c99b650068c5d51e6746131d5b.jpeg)
练习:
1.将0X39A7F8转换为二进制
答案:0011 1001 1010 0111 1111 1000
2.将二进制1100 1001 0111 1011转换为十六进制
答案:0XC97B
其他进制间的转换就不列举了,不熟悉的可自行练习。
2、寻址和字节顺序
在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中的最小的地址。例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在内存的0x100, 0x101, 0x102, 0x103位置。而存储地址内的排列则有两个通用规则。一个多位的整数将按照其存储地址的最低或最高字节排列。如果最低有效位在最高有效位的前面,则称小端序;反之则称大端序。
例如假设上述变量x类型为int,位于地址0x100处,它的十六进制为0x01234567,地址范围为0x100~0x103字节,其内部排列顺序依赖于机器的类型。大端序从首位开始将是:0x100: 01,0x101: 23,0x102:45,0x103:67。而小端序将是:0x100: 67,,0x101: 45,...
![368269f42ad7f97cb5354755f9c18f8c.png](https://i-blog.csdnimg.cn/blog_migrate/a4b9f38a8d972c1508f5af4770072f73.jpeg)
在网络应用中,字节序是一个必须被考虑的因素,因为不同机器类型可能采用不同标准的字节序,小端序机器发送数据给大端序机器或者反过来时,字里的字节会是反序的,所以必须按照网络标准进行转化。网络传输一般采用大端序,也被称之为网络字节序。
![13212c5399d86edcf7678c6d45abdc74.png](https://i-blog.csdnimg.cn/blog_migrate/768b4cca2f75062fb9a641af3c98d51e.jpeg)
特别说明:Linux,Windows是小端序机器,Sun的机器是大端序
3、数据类型大小
![3a563173fd3093cc1e97e6fe2552a43b.png](https://i-blog.csdnimg.cn/blog_migrate/2d97b3f1631bba7da2193d0a217f5977.jpeg)
![92eb51c31acc063582957c2223ebe47f.png](https://i-blog.csdnimg.cn/blog_migrate/dd7355339801dc19984a7b89ad2f58c2.jpeg)
![2255370e0370e8bf9306b0e17e7a936f.png](https://i-blog.csdnimg.cn/blog_migrate/2b75fe367f2d68aa20f9024b8d10bab8.jpeg)
数据类型int32_t和int64_t分别为4个字节和8个字节,大小是固定的,不随编译器和机器设置而变化。
特别说明:对于float数据,Linux32、Windows和Sun的机器使用4字节地址,Linux64使用8字节地址。字符串在使用ASCII码作为字符码的任何系统上都将得到相同的编码结果,与字节顺序和大小规则无关,因而文本数据比二进制数据具有更强的平台独立性。
下一篇将写剩下的整数及浮点数的表示
感谢作者Randal E. Bryant和David R. O'Hallaron
如有错漏之处望指出,推荐亲自阅读《深入理解计算机系统》