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的两种存储方式如下
2.1.7位级运算
| & ~ ^ :或、与、非、异或
2.1.8逻辑运算
2.1.9移位运算
左移没什么好说的
右移运算分为了逻辑右移和算术右移
- 逻辑右移:在左端补0
- 算术右移:在左端步最高有效位的值,在处理有符号整数的时候非常有用,一般默认对有符号整数采用算数右移,而对于无符号数,必须是逻辑的
相比于C,Java有着更加准确的定义,算数右移:>> 逻辑右移>>>
移位的k一般是小于等于字长的,如果大于了那一般是经过mod字长后进行移位运算
2.2整数表达
2.2.1整数数据类型
C语言支持多种整数数据类型,每种数据类型都用相应的关键字来确定大小,而且不同的大小分配的字节数根据编译为32位还是64未而有所不同,所以整理出下表,下表中的每种类型所表示的数据范围都是计算而来的,而不是记忆的。
2.2.1无符号数的编码
无符号数的编码的定义(二进制转无符号数)
无符号数的二进制表示有一个很重要的属性,就是每个介于0~2^w-1之间的数都有唯一一个w位的值编码。双射的数学属于可以解释该原理。
2.2.3 补码编码
补码编码的定义
与我之前的理解有点出入,所以将示例放在了下面
下图是一些经常引用的特殊的值,以作记录
关于以上的数字,有以下的注意点
- 补码范围的不对称
- 最大的无符号数值正好比补码的最大值的两倍大一点
2.2.4有符号数和无符号数之间的转换
对大多数C语言的实现,规则一般是数值可能改变,但是位模式不变,
所以经过2.1和2.3的转换,补码转成无符号数的公式如下
经过推导,无符号数转补码的公式如下
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:特殊值
以上暂时没有理解,之后再详细学习