最近发现有时候看完一本书,时间久了容易忘记,看书不总结思考效果大打折扣,故打算写这一系列文章,一是为了整理书中的要点,帮助自己消化理解;二是勉励自己多看书思考。文章中不会把书中内容讲解的非常详细,只是总结概括,适合已经阅读过该书的读者。
(1)信息存储
大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的存储器单位,而不是在存储器中访问单独的位。一个字节由8位组成,二进制中的范围是:00000000~11111111,十进制中的范围是0~255,十六进制中的范围是00~FF。在C语言中,以0x或者0X开头的都是十六进制
在C语言中,不同的数据类型分配的字节数时不同的,如下表所示:
C声明32位机器64位机器char11int44short int22long int48float44double88char *48排列表示一个对象有两个通用的方法,最低有效字节在最前面的方式,称为小端法(litte endian)。最高有效字节在最前面的方式,称为大端法(big endian)。大多数Intel兼容机都采用了小端法,不同的数据值的字节表示,在不同的机器中,除了字节顺序以外,结果都是一样的。但是指针值域机器时相关的(32位、64位区别)。
在C语言中,有以下几种运算:
位级运算:| 就是OR,& 就是AND,~ 就是NOT,^ 就是EXCLUSIVE-OR逻辑运算:||,&&,!移位运算:<< 左移位,>> 右移位其中,在右移位中,分为:
逻辑右移,即在左端补0算术右移,即在左端补最高位(2)整数表示
用位来编码整数有两种不同的方式:一种只能表示非负数,即无符号数;另一种能表示负数,零和正数。C和C++均支持有符号和无符号数,Java仅支持有符号数。
无符号数的编码:将位看作是二进制表达式。补码编码:同样将位看作是二进制表达式,但最高位的权重是-1。用来表示有符号数。有符号数的其他表示方法还有反码和原码,但这两种方法对0的编码方式有两种不同的方式。C语言标准并没有要求用补码形式表示有符号数,但是几乎所有的机器都是这么做的。在Java中,单字节数据类型称为byte,而不是char,而且没有long long数据类型。这些非常具体的要求都是为了保证无论在什么机器上,Java程序运行的表现都能完全一样。
对大多数C语言的实现而言,处理同样字长的有符号数和无符号数之间相互转换的一般规则是:数值可能变化,但是位模式不变。另外,在执行一个运算时,如果它的一个运算数是有符号的,而另一个是无符号的,那么C语言会隐式地将有符号参数强制转换为无符号数。
数字的扩展和截断有以下几种方法:
零扩展:将一个无符号数转换为一个更大的数据类型,只需简单地在表示的开头添加0符号扩展:将一个补码数字转换为一个更大的数据类型,是在表示中添加最高有效位的值的副本截断:丢弃最高若干位。(3)浮点数
IEEE浮点标准用V=(-1)^s*M*2^E的形式来表示一个数
符号(sign)s决定这个数是负数还是正数尾数(significand)M是一个二进制小数阶码(expoent)E的作用是对浮点数加权浮点数的位表示划分为三个字段,分别对这些值进行编码:
一个单独的符号位s直接编码符号sk位的阶码子短exp=e_k-1…e_1e_0编码阶码En位小数字段frac=f_n-1…f_1f_0编码尾数M在单精度浮点格式(C语言中的float)中,s、exp和frac字段分别为1位、k=8位和n=23位,得到一个32位的表示;在双精度浮点格式(C语言中的double)中,s、exp和frac字段分别为1位、k=11位和n=52位,得到一个64位的表示。
情况1:规格化的值
当exp的位模式既不全为0,也不全为1时,属于这种情况。阶码的值是E=e-Bias,其中e是无符号数,其位表示为e_k-1…e_1e_0,而Bias是一个等于2^(k-1)-1的偏置值;尾数定义为M=1+f,f=0.f_n-1…f_1f_0。情况2:非规格化的值
当阶码域为全0时,所表示的数就是非规格化形式。在这种情况下,阶码值是E=1-Bias,而尾数的值是M=f。情况3:特殊值
当阶码全为1的时候,小数域全为0,得到的值表示无穷;当小数域为非0时,结果被称为NaN,即不是一个数。(1)机器级代码
汇编代码表示非常接近于机器代码。与机器代码的二进制格式相比,汇编代码有一个的主要的特点,即它用可读性更好的文本格式来表示。
程序计数器(在IA32中,通常称为“PC”,用%eip表示)指示将要执行的下一条指令在存储器中的地址整数寄存器(register)文件包含8个命名的位置,分别存储32位的值。这些寄存器可以存储地址或整数数据。条件码寄存器保存着最近执行的算术或逻辑指令的状态信息。一组浮点寄存器存放浮点数据。大多数gcc生成的汇编代码指令都有一个字符后缀,表明操作数的大小,如下图所示:
一个IA32中央处理单元(CPU)包含一组8个存储32位值的寄存器。前6个寄存器都可以看成通用寄存器,对它们的使用没有限制。最后两个寄存器(
