20150207读书笔记<深入理解计算机系统2-1>



第二章

信息存储

(1)

    多数计算机以一个字节作为最小可寻址的存储器单元。

机器级程序将存储器看成一个非常大的字节数组,称为虚拟存储器。

存储器的每个字节都由唯一的数字标识,称为它的地址。

所有可能地址的集合称为虚拟地址空间。

       扩充:C语言中一个指针的值,无论它是指向一个整数,一个结构或是某个其他程序的对象,都是指针指向的存储块的第一个字节的虚拟地址

       C编译器还将每个指针和类型信息联系起来,这样就可以根据指针值的类型,生成不同的机器级代码来访问存储在指针指向位置的值,尽管如此,它生成的实际机器级程序并不包含指针类型信息,每个程序对象可以简单地视为一个字节块,程序本身就是一个字节序列

(2)

       字长:指明整数和指针数据的标称大小,由硬件决定。

决定虚拟地址空间的最大大小,因为虚拟地址空间是以一个字编码的。

(3)

char以存储文本串中的但个字符而得名,但也可以存储整数值。

Test:char s = x;       //x∈[-128,127]正常整数值,其余截断显示数值

unsigned char s = x; //x∈[0,255)正常整数值,其余截断显示数值

  

程序员应该力图增强程序的可移植性,可移植的一个方面就表现在使程序对不同的数据类型的确切大小不敏感。

(4)

对于跨字节的程序对象,必须建立两个规则:一这个对象的地址是什么,二在存储器中如何让排列这些字节。

  小端:低数据放在低地址。

  大端:低数据放在高地址。

  目前比较新的处理器使用 双端法 。

%.2x表示整数必须要用至少两个数字的十六进制格式输出。

十进制数字 X 的ASCII码正好是 0x3X。

ASCII码作为字符码在任何系统上都将得到相同的结果,与字节顺序和字大小顺序无关,因而,文本数据比二进制数据具有更强的平台独立性。

不同的机器类型,不同的操作系统,使用不同的且不兼容的指令和编码方式,因此二进制代码是不兼容的。

(5)

位向量:长度为W的0,1串。eg:a = [01010011] w = 8

位向量可用来表示有限的集合。用[Ai,A(i-1),...A1,A0]表示集合B{0,1,2,....i},当且仅当Ai = 1.使用这种编码集合,|和&等同于并和交。

eg:a = [01010001]表示集合A={0,4,6};

b = [01110110]表示集合B={1,2,4,5,6};

(6)

逻辑运算认为:0表示False,其余均表示1.

eg:!0x41 = 0   !0x00 = 1

逻辑运算对第一个参数求值能确定表达式结果时,不再对第二个参数求值。

(7)

移位运算,从左至右 结合。

特殊:算数右移K位,是在移出的K个高位补移动前最高位的数值。(对有符号整数的运算十分有用)

C标准并未明确定义应该使用哪种类型的右移。

对无符号数据,右移必须是逻辑右移。

实际中,几乎所有编译器都对有符号数采用算数右移。

当移位数K > 字长M,C标准规定,位移量为K % M,但也要尽量使移位量小于字长。

整数表示

   尽管C语言标准并未指定有符号数采用哪种(原码,补码,反码)表示,但是几乎所有的机器都使用补码表示。

C库<limits.h>中定义了一组常量,来限定编译器运行的这台机器上不同整型数据类型的取值范围。

C语言有无符号数值转换的原则是,底层的位表示保持不变。

扩展:

有符号短数据SS---》无符号长数据UL:先将SS转换成有符号长数据SL,再将SL转换成UL.即先扩展大小再改变符号

eg:short s = x;

unsigned int p = s;  //等价于 p = ( unsigned ((int)s) )

测试:

  

截断:

长数据L---》短数据S,进行位截断。

无符号数的截断为:L % (S类型的最大值)

有符号数:不仅数值大小可能变化,符号位也可能发生改变。



  这两天虽然没有多大的进步,但是看了书就会觉得日子过得充实一些,在教5的509一群上自习的孩子,看到他们就像看到了压力,虽然我到现在才悟到自己和他们的差距还很大,希望每一天都能有一定的小进步,二叉树的C++版实现了,但是使用迭代器实现非递归遍历没有成功,明天早上一天的课,早点休息了~晚安了,亲爱的自己~哈哈哈~

 

时间: 2024-12-11 13:05:54

20150207读书笔记<深入理解计算机系统2-1>的相关文章

20150206读书笔记&lt;深入理解计算机系统&gt;

●第一章 C是系统级编程的首选.C++显示支持抽象,属于应用级程序设计语言. 简单例子: 一个典型系统的硬件组成: 存储器的层次结构: 注:存储器层次结构的设计思想是,该层存储器作为下一层存储器的高速缓存 总结:计算机系统的一个重大主题就是提供不同层次的抽象表示,来隐藏实际实现的复杂性.  操作系统内核是应用程序和硬件之间的媒介.提供3个基本的抽象: (1)文件是对I/O设备的抽象 (2)虚拟存储器是对主存和磁盘的抽象 (3)进程是对处理器,I/O设备和主存的抽象. 虚拟机是对整个计算机(操作系

【读书笔记::深入理解linux内核】内存寻址

我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开启分页之后,任何寻址都要经过mmu的转换,也就是一个二级查表的过程(386) 难道内核很特殊,当mmu看到某个逻辑地址是内核传来的之后,就不查表了,直接减去0xC0000000,然后就传递给内存控制器了??? 我发现网上也有人和我问了同样的问题,看这个问题 这句话太让人费解了,让人费解到以至于要怀疑

读书笔记-深入理解JVM虚拟机-1.OOM初探

Java堆OOM(Out-Of-Memory)异常 执行例如以下程序,爆出异常 java.lang.OutOfMemoryError: Java heap space /** * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * @author zzm */ public class HeapOOM { static class OOMObject { } public static void main(String[] args

[转][读书笔记]深入理解java虚拟机

原文地址:http://blog.csdn.net/hanekawa/article/details/51972259 第二章 Java内存区域与内存溢出异常 一,运行时数据区域: 1.        程序计数器:当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一跳需要执行的字节码指令.如果执行的是native方法,这个计数器的值则为空. 2.        Java虚拟机栈 线程私有,生命周期与线程相同.描述的是java方法执行的内存模型:每个方法在执行

[阅读笔记]深入理解计算机系统

5.优化程序性能 1.存储器别名(memory aliasing),妨碍优化.__restrict关键字 2.消除不必要的存储器引用,使用临时变量. 6.存储器层次结构 1.寄存器0周期,cache 1-10,主存50-100. 冷不命中cold miss和冲突不命中 conflict miss. 2.cache结构

读书笔记-深入理解JVM虚拟机-1.JVM-Stack造成的OOM的理解

-Xss128k:这个JVM参数用来配置栈的大小为128k 因为栈是线程私有的(不清楚的可以去了解下JVM虚拟机结构),所以如果我们启动一个线程,并且在这个线程中调用一个递归,就会产生该异常. /** * VM Args:-Xss128k * */ public class JavaVMStackSOF { private int stackLength = 1; public void stackLeak() { stackLength++; stackLeak(); } public sta

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

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

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

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

第七章读书笔记《深入理解计算机系统》

第七章 读书笔记<深入理解计算机系统> 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行. 链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于加载时,也就是在程序被加载器加载到存储器并执行时:甚至执行于运行时,由应用程序来执行. 在早期的计算机系统中,链接是手动执行的.在现代系统中,链接是由叫链接器的自动执行的. 7.1 编译器驱动程序 1.大部分编译系统提供编译驱动程序:代表用户在需要时调用语言预处理器.编译器.汇编器