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

2.1信息存储

机器程序将内存视为一个很大的字节数组,称为虚拟内存。所有可能的地址集合称为虚拟地址空间,实际上,该功能的实现是将动态随机访问存储器(DRAM)、闪存、磁盘存储器、特殊硬件和操作系统软件结合起来,使其看上去是一个统一的字节数组。

2.1.1十六进制

十进制转十六进制的方法:如果x是2的非负整数n次幂,那么把n表示成i+4j的形式,其中0<=i<=3,当i=0时,x的开头写成2^i.后面跟j个0。如果没什么规律那就整除取余法

2.1.2字数据大小

字长指明了指针数据的标称大小,决定了虚拟地址空间的最大大小,如一个字长为w的机器,虚拟地址的范围就是0~2^w-1 .程序最多访问2^w个字节.所以经过计算,32位的操作系统的内存利用的最多只是4G。(这个问题还需要进一步的深究,还没有理解透彻)

2.1.3寻址和字节顺序

考虑一个w位的整数,其位表示为[x(w-1),x(w-2),......x(1),x(0)],其中的x(w-1)是最高有效位,x(0)表示最低有效位,将这些位转成字节,那么最低有效字节就是[x(7),x(6)......x(0)]。在内存中,最低有效位在前的方式称为小端法,最高有效位在前的方法称为大端法。如某个int的值的十六进制是0x01234567的两种存储方式如下


image.png

2.1.7位级运算

| & ~ ^ :或、与、非、异或

2.1.8逻辑运算

2.1.9移位运算

左移没什么好说的
右移运算分为了逻辑右移和算术右移

  • 逻辑右移:在左端补0
  • 算术右移:在左端步最高有效位的值,在处理有符号整数的时候非常有用,一般默认对有符号整数采用算数右移,而对于无符号数,必须是逻辑的
    相比于C,Java有着更加准确的定义,算数右移:>> 逻辑右移>>>
    移位的k一般是小于等于字长的,如果大于了那一般是经过mod字长后进行移位运算

2.2整数表达

2.2.1整数数据类型

C语言支持多种整数数据类型,每种数据类型都用相应的关键字来确定大小,而且不同的大小分配的字节数根据编译为32位还是64未而有所不同,所以整理出下表,下表中的每种类型所表示的数据范围都是计算而来的,而不是记忆的。


32位程序上C语言整型数据类型

64位程序上C语言整型数据类型

2.2.1无符号数的编码

无符号数的编码的定义(二进制转无符号数)



无符号数的二进制表示有一个很重要的属性,就是每个介于0~2^w-1之间的数都有唯一一个w位的值编码。双射的数学属于可以解释该原理。

2.2.3 补码编码

补码编码的定义



与我之前的理解有点出入,所以将示例放在了下面



下图是一些经常引用的特殊的值,以作记录

关于以上的数字,有以下的注意点

  • 补码范围的不对称
  • 最大的无符号数值正好比补码的最大值的两倍大一点

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

对大多数C语言的实现,规则一般是数值可能改变,但是位模式不变,
所以经过2.1和2.3的转换,补码转成无符号数的公式如下



经过推导,无符号数转补码的公式如下


image.png

2.2.5C语言中有符号位和无符号位

一个有符号、一个无符号,C语言会隐式地将有符号参数转为无符号参数,所以在进行某些大于或者小于判断的时候,会有一些非直观的现象产生。

2.2.6拓展数字的位表达

从一个较小的数据类型转为一个较大的类型,理论上应该保持两者的相同。所以出现了无符号数的零扩展和补码数的符号扩展

2.2.7截断数字

  • 截断无符号数
    x截断为k位的结果是xmod2^k。 该原理背后的直觉是所有被截去的位权重都是2^i,其中i>=k,所以每一个权在取模之后都变成了零,所以推到得到该结果
  • 截断补码数值
    x截断为k位的结果是U2T(x mod 2^k), 括号中的含义与上述类似,函数是为了把最高有效位转成-2^(k-1).

2.3整数运算

2.3.1无符号加法

无符号的加法存在以下的原理



检测无符号数加法中的溢出
对于x,y 计算s=x+y,当且仅当s 无符号数求反
对于满足0<=x<2^w 的任意x,其中w位的无符号逆元是以下的公式


2.3.2补码加法

首先原理如下



检测补码加法中的溢出
s=x+y,当且仅当x,y大于零但s小于零时产生了正溢出,而当x,y小于零,但x大于零时,产生了负溢出

2.3.3补码的非

公式如下,求补码非得位级表示可以用求反后加一的来快速求得


2.3.4无符号乘法

原理如下


2.3.5补码乘法

2.3.6乘以常数

  • 乘以2的幂
    左移一个数值等价于执行一个与2的幂相乘的无符号乘法。
  • 归纳
    同时乘以常数K的表达可以通过以下的方法进行优化,首先,将K的二进制表达成一组0和1交替的序列[(0...0)(1...1)(0...0)]
    可以用下面两种不同形式中的一种来计算这些位对乘积的影响:考虑一组从位位置n到位位置m的连续的1(n>=m)
    形式A:(x< 形式B:(x<<(n+1))-(x<

2.3.7除以2的幂

  • 除以2的幂的无符号除法



    除以2的幂的无符号除法

  • 向下舍入


  • 向上舍入(该处符号有误)


2.4浮点数

2.4.1二进制小数

用最基础的小数点右边的权设为1/2^i 的方法可以近似的描述二进制小数

2.4.2 IEEE浮点表示

V=(-1)^s* M*2^E
一共三个字段。符号位、整数位和小数位


单精度浮点数的分类
  • 情况1:规格化的值

  • 情况2:非规格化的值

  • 情况3:特殊值

以上暂时没有理解,之后再详细学习

你可能感兴趣的:(《深入理解计算机系统》第二章 信息的表示和处理)