《深入理解计算机系统》2.1信息存储

信息存储

机器级程序将存储器视为一个非常大的字节数组称为虚拟存储器,存储器的每个字节都由一个唯一的数字来标识,称为它的地址,所有可能的地址的集合称为虚拟地址空间这个虚拟地址空间只是一个展现给机器级程序的概念性映像。实际的实现是将随机访问存储器(RAM)、磁盘存储器、特殊硬件和操作系统软件结合起来,为程序提供一个看上去统一的字节数组。

进制转换


每台计算机都有一个字长,指明整数和指针数据的标称大小。大多数计算机的字长是32位,那么它有2∧32种地址大概刚超过4GB大小,即它的虚拟地址空间最大这么多。

数据大小

许多机器能处理单字节,2,4,8字节(64位)。对于32位机器他会把64位数据处理成一系列32位操作的代码。

程序员应该力图使他们的程序在不同的机器和编译器上是可移植的,比如声明一个int(32位大小)类型的程序对象能被用来存储一个指针,但是在一台64位机子运行该程序可能出问题

 

寻址和字节顺序

对于跨越多字节的程序对象,我们必须建立两个规则:

  1. 这个对象的地址是什么
  2. 在储存器中如何排列这些字节

地址是什么

几乎所有机器,对象的地址为所使用字节最小的地址,例如:一个int类型数据有四个字节地址分别为0x001,0x002,0x003,0x004,那么这个int数据的地址为0x001。

如何排列

大端和小端存储(注意是数据存储!非地址)

小端存储:

机器在存储器中按照最低有效字节到最高有效字节的顺序存储对象,也就是说最低有效字节在前面,Intel的机器就是这样

大端存储:

机器按照最高有效字节到最低有效字节的顺序存储对象

例如:

有一int类型数据,其地址为0x100,其保存的16进制数据为0x01234567(16进制每两个数字用1字节储存,01是高字节,67是低字节)

通常机器所使用的字节顺序是不可见的

但是有时,字节顺序可能成为问题

1,在不同类型的机器之间通过网络传输二进制数据时,小端法机器产生的数据到大端法的机器变成反序的.为了避免这个问题,代码编写必须遵守字节顺序的规则

2,阅读整数数据的字节序列时字节顺序也很重要

3,当编写规避正常的类型系统的程序时。(强制类型转换)

布尔代数

位向量:有固定长度为w,由0和1组成的串

&

|

^

&对|有分配律:a&(b|c)=(a&b)|(a&c)

|对&也有分配律:a|(b&c)=(a|b)&(a|c)

位向量可用于表示有限集合。我们可以用位向量[aw1,.....,a1,a0]编码任何子集A∈{0,1,....,w-1}其中ai=1当且仅当i∈A。例如,(记住我们是记aw-I写在左边,而将a0写在右边,即写的方向相反),位向量a=[01101001](最后一位为1,说明集合中有0,倒数第4为1,说名集合有3)表示集合A={0,3,5,6},而b=[01010101]表示集合B={0,2,4,6}

这样我们可以用|,&对应并,交,对集合操作。

比如a&b=[01000001],A交B={0,6}。

=======∑(っ °Д °;)っ=========未完待续=============三c⌒っ?Д?)っΣ( ° △ °|||)︴==========

时间: 2024-12-24 04:30:17

《深入理解计算机系统》2.1信息存储的相关文章

《深入理解计算机系统(第三版)》第二章 信息的表示和处理

<深入理解计算机系统(第三版)>第二章 信息的表示和处理 ??计算机本身是由处理器和存储器子通过系统组成.在核心部分,我们需要方法来表示基本数据类型,比如整数和实数运算的近似值.然后,我们考虑机器级指令如何操作这样的数据,以及编译器又如何将C程序翻译成这样的指令.接下来,研究几种实现处理器的方法,帮助我们更好的了解硬件资源如何被用来执行指令.理解了编译器和机器级代码,我们就能了解如何通过编写C程序以及编译它们来最大化程序的性能.本章主要使我了解了如何表示和执行应用程序,通过一些技巧,来写出安全

深入理解计算机系统PDF下载

深入理解计算机系统PDF下载 我们这些程序员提升发展的书籍,本人亲自拜读过这本书,内容新颖,仿佛打开了我的另一扇大门,读完获益匪浅,所以拿出来跟老铁们一起分享!!! 链接:https://pan.baidu.com/s/1rVB4BD7USTHN9zfFem7Bww 提取码:n4be 目录 · · · · · · 出版者的话 中文版序一 中文版序二 译者序 前言 关于作者 第1章 计算机系统漫游1 1.1 信息就是位+上下文1 1.2 程序被其他程序翻译成不同的格式3 1.3 了解编译系统如何工

深入理解计算机系统9个重点笔记

引言 深入理解计算机系统,对我来说是部大块头.说实话,我没有从头到尾完完整整的全部看完,而是选择性的看了一些我自认为重要的或感兴趣的章节,也从中获益良多,看清楚了计算机系统的一些本质东西或原理性的内容,这对每个想要深入学习编程的程序员来说都是至关重要的.只有很好的理解了系统到底是如何运行我们代码的,我们才能针对系统的特点写出高质量.高效率的代码来.这本书我以后还需要多研究几遍,今天就先总结下书中我已学到的几点知识. 重点笔记 编写高效的程序需要下面几类活动: 选择一组合适的算法和数据结构.这是很

读书笔记《深入理解计算机系统》(第三版) 概述

<深入理解计算机系统>第三版刚出来不到一周,便买下了这本书:之所以阅读本书,一方面源于网友推荐以及豆瓣不错的评分.评价:另一方面是针对本人非科班出身,计算机系统相关的知识相对比较薄弱,很多情况下此类知识需要工作之外的时间自学.补涨此类知识,而该书从程序员的角度进行阐述.展示了计算机系统的各个层面的知识以及其影响程序的正确性.性能.实用性,更容易引起某些上层和下层的知识接轨理解,以期望可以融汇各方面的知识. 明白程序的运作过程,编写更好的软件程序,对底层过程了解以完善自己知识体系和提高信心.接下

《深入理解计算机系统》 Chapter 7 读书笔记

<深入理解计算机系统>Chapter 7 读书笔记 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(货被拷贝)到存储器并执行. 链接的时机 编译时,也就是在源代码被翻译成机器代码时 加载时,也就是在程序被加载器加载到存储器并执行时 运行时,由应用程序执行 链接器使分离编译称为可能. 一.编译器驱动程序 大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器.编译器.汇编器和链接器. 1.将示例程序从ASCⅡ码源文件翻译成可执行目标文件的步骤 (1)运

【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才表现出来.前几天线上模块因堆内存写越界1个字节引起各种诡异崩溃,定位问题过程中的折腾仍历历在目,今天读到<深入理解计算机系统>第9章-虚拟存储器,发现书中总结了C程序中常见的内存操作有

《深入理解计算机系统》第六周学习笔记

第四章 处理器体系结构 (一)知识点总结 一.Y86指令集体系结构 1.Y86处理器状态类似于IA32,有8个程序寄存器: %eax.%ecx.%edx.%ebx.%esi.%edi.%esp.%ebp.处理器的每个程序寄存器存储一个字.%esp被入栈.出栈.调用和返回指令作为栈指针. 2.3个一位的条件吗:ZF.SF.OF,它们保存最近的算术或逻辑指令所造成影响的有关信息.程序计数器PC存放当前正在执行指令的地址. 3.程序状态的最后一个部分是状态码stat,它表明程序执行的总体状态 4.Y8

深入理解计算机系统(4.2)---硬件的魅力

引言 这个系列已经很久没更新了,记得上一篇博文已经是三月份了,实在是抱歉.最近业余时间没有以前充裕了,因此更新一篇博文已经变成了一种奢侈.记得以前刚开始写的时候,最多的时候LZ一天写过3篇博文,现在想想,往事如梦. 好了,好不容易写一次,就不多说废话了,本文主要介绍一下硬件以及HCL语言的内容. 从疑问开始 首先,在介绍本文的内容之前,我们先来思考一个看似简单,却实际比较“高深”的问题.众所周知,计算机归根结底是在和0.1打交道,那么到底0和1是如何被计算机记住的呢? 怎么样,这个问题是不是有点

深入理解计算机系统读书笔记一 ---&gt; 计算机基础漫游

一.程序编译的不同阶段. 通常我们是以高级程序开发易于阅读的代码,我们通过语法规则推断代码的具体含义.但是计算机执行代码的时候就需要把代码解析成既定的可执行问题,计算机是如何处理的呢?这里以C语言hello.c文件为例来说明中间过程. #include <stdio.h> int main() { printf("hello world!\n"); } 先上张图. C语言源程序----预处理解析头文件和函数  --- 编译器解析成汇编语言 ---   翻译机器语言指令,打包

深入理解计算机系统(3)

深入理解计算机系统(3) 本文我们主要讲关于数据的的表示方式:原码,反码和补码. 本文在写作过程中,参考了园中的这篇文章<原码,反码,补码详解>,特此声明. 一原码 计算机中是使用二进制来表示数据的,对于C语言这样的强类型语言,每一个数值类型,都有其范围,例如一个int类型,在32位机器上,其表示的范围如下: 最小值 最大值 有符号整数 -2147483648 217483647 无符号整数 0 4294967295 而如果我们定义了一个int类型,给其的赋值,超出了这个范围,则会出现问题.一