计算机系统读书笔记二

十进制对人处理信息来说很友好。

二进制在构造存储和处理信息的机器时表现的更好。可以很容易被表示、存储、传输。如:穿孔卡片上的有洞无洞,导线上的高低电压,顺时针或逆时针的磁场。

 

单独的位或者位组合必须有上下文才有意义。

 

无符号编码:大于等于零的数字。

补码编码:表示有符号整数的方式。

浮点数编码:表示实数的科学记数法以2为基数的版本。

计算机的表示法是用有限数量的位来对一个数字编码,所以会产生溢出。

 

信息存储:

一般计算机使用8位的块(字节byte)作为最小的可寻址的内存单位,而不单独访问内存中的单独位。

 

机器级程序将内存视为一个非常大的字节数组,称为虚拟内存,内存的每个字节都由一个唯一数字来标识,称为它的地址,所有可能地址的集合就称为虚拟地址空间。

虚拟地址空间展现给机器级程序的是概念性的映像。实际是将动态随机访问存储器DRAM,闪存,磁盘存储器,特殊硬件和操作系统软件结合起来,为程序提供一个看上去统一的字节数组。

 

一个程序内部有不同的对象,如程序数据,指令,控制信息。编译器和运行时系统将存储空间划分为更可管理的单元,使用各种机制来分配和管理程序不同部分的存储。这种管理完全是在虚拟地址空间里完成的。

 

C语言的指针包含两个方面:值和类型。编译器会根据指针值类型生成不同的机器级代码来操作值。

 

十六进制表示法:

一个字节由8位组成,十进制的值域是0-255.二进制的值域是00000000-11111111。两种符号表示法对于描述位模式都不方便,二进制太冗长,十进制转化麻烦。用16为基数的十六进制数(hex),表示位模式。使用数字0-9和字符A-F表示16个值,一个字节的值域为00-FF。

以0X或0x开头的数字常量被认为是十六进制数。

 

十进制,二进制,十六进制的相互转换。

1.0X39A7F8转为二进制--0011 1001 1010 0111 1111 1000

2将1100 1001 0111 1011转为十六进制数 0XC97B

 

字数据大小:

每台计算机都有一个字长来定义指针数据的标准大小。虚拟地址是以这样一个字来编码的,字长决定的最重要的系统参数就是虚拟地址空间的最大大小。

对于一个字长为W位的机器而言,虚拟地址范围位0~2^W-1,程序最多访问2^W个字节。如:32位机和64位机。

 

C语言声明指针

对于任何数据类型T,声明 T *p; 表明p是一个指针变量,指向一个类型为T的对象。

 

寻址和字节顺序

计算机对于寻址,必须基于两个准则:这个对象的地址是什么,以及在内存中如何排列(大端法和小端法)。

对于多字节对象的地址使用其所有字节中最小的地址。就像数组对象的地址是数组第一个值的地址。

 

在内存中排列顺序:大端法和小端法之争。此处概念容易混乱

小端法:最低有效位在前面,最高有效位在后面。

大端法:最高有效位在前面,最低有效位在后面。

 

Interl兼容机一般用小端模式。

现在的计算机的微处理器是双端法。可以配置成大端或者小端的机器运行。

反汇编器:是一种确定可执行程序文件所表示的指令序列的工具。

 

大端法机器和小端法机器之间交互时的问题:

1.字节顺序问题,小端机产生的数据被发送到大端法机器或者反过来,接收到的字节都是反序的。通过网络应用程序来进行转化。

2.阅读机器级源码时,也会产生问题(因为高级语言屏蔽了这个问题)。

3.强制类型转换或者联合来以一种数据类型引用一个对象,这种转换前的数据类型与转换后的数据类型不同。这种如果不确定大端法还是小端法,就会转换出错。

 

C语言中的typedef

typedef提供了一种给数据类型命名的方式。

C中取地址运算符&。

 

 

表示字符串:

C语言中字符串被编码为一个null(其值为0)字符结尾的字符数组。

 

布尔代数:

逻辑值true和false编码为二进制值1和0

四种逻辑运算:与&、或|、非~、异或^

逻辑运算可以用逻辑电路来实现,就是与门,或门,非门,异或门。然后又抽象出来半加法器和全加法器。

 

布尔环的的概念。

(a^b)^a = b

这种可以用来交换两个数据的位置。

如:交换一个数组中a和b的位置。常用的方法是引入一个临时变量

int temp = a;

a=b;

b=temp;

如果使用布尔环(面试题):

a = a^b;

b = a^b;

a=a^b;

 

C语言中的位级运算 & | ~ ^:

位级运算一个用法就是实现掩码运算,掩码是一个位模式,表示从一个字中选出位的集合。

例如:掩码0xFF可以表示低8位的集合。0x89ABCDEF & 0xFF = 0x000000EF

 

C语言中的逻辑运算 && || !

逻辑运算认为所有非零的参数都表示true,而0表示false。

 

C语言中的位移运算:

>>右移符号,<<左移符号。

左移时丢弃最高位,并在右端补0。

右移时分为:逻辑右移和算术右移。

逻辑右移丢弃低位,在左端补0.

算术右移在左端补最高有效位的值。

Java中,>>表示算术右移,>>>表示逻辑右移。

 

 

整数表示:

用位来编码整数的两种不同方式:一种只能表示非负数,一种能表示负数、零、正数。

 

整型数据类型:关键字-char short long int unsigned

C支持有符号和无符号数,Java只支持有符号数。

 

无符号数的编码

 

补码编码:有符号数的计算机表示负数的方式就是补码。

最高有效位是符号位,1表示值为负,0表示值为非负。

有符号数还有两种标准表示法:反码和原码。

 

有符号数和无符号数之间的转换。

 

整数运算:

两个正数相加得到一个负数,是由于计算机运算的有限性造成的。

1.无符号数相加

2.补码相加

 

 

浮点数

1.二进制小数

2.IEEE浮点表示

3.数字示例

4.舍入:向偶数舍入,向零舍入,向下舍入,向上舍入。

5.浮点运算

 

小结:

计算机将信息编码为位,通常组织成字节序列。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值