首页 > 代码库 > 【CSAPP】二、信息的表示和处理

【CSAPP】二、信息的表示和处理

三种重要的数字表示:无符号 、 补码 、 浮点数。

【一】信息存储

最小单位是字节, 在操作系统层面,只需要关注地址。系统将存储器空间划分为更可管理的单元,存放不同的程序对象(程序数据、指令、控制信息)

1、16进制表示法:用两个16进制字符表示一个字节,00 - FF。 练习:16进制、10进制、2进制的相互转换。

2、字: 字长决定虚拟地址空间的最大大小。32位计算机虚拟地址空间为 2^32个,即4GB

3、数据大小:整数short2/int4/long一字/longlong8,浮点数float4/double8, char1, char *一字

4、寻址和字节顺序:多字节对象的规则:地址+如何排列。

小端法:前面的地址存放小的位,后面的地址存放大的位、大端法相反

可能用到的场景:1、网络传输二进制数据。2、反汇编:从指令字节级表示到汇编程序 3、强制类型转换

5、表示字符串:结尾为0x00(null, ascii码为0),文本数据比二进制数据平台独立性更好

6、表示代码:二进制编码不兼容。

7、c中位运算:~ | & ^,常见用法:自己与自己做异或,得到的是自身。掩码运算。

8、c中逻辑运算:&& || !,

9、c中移位运算:左移 << 右移:

逻辑右移:左端补0

算术右移:左端补最高位,

无符号数据是逻辑右移,有符号数据,算数右移。

 

【整数表示】

技术分享

有符号数第一位是负的 2^(n-1),

有符号和无符号的切换:

 技术分享

c中有符号数和无符号数运算,有符号数自动转换为无符号数!

这一点很坑,最好的解决方法是永远不用无符号数。

扩展数字的位表示:无符号零扩展,有符号符号扩展(类似逻辑右移)

 

【整数运算】

 1、无符号加法:

技术分享

2、有符号加法:

技术分享

3、补码的非

技术分享

4、无符号乘法

技术分享

5、补码乘法

技术分享

高位不一致,低位是相同处理方式的。

6、乘以常数:乘法运算通常需要10个以上时钟周期,但是乘以常数可以通过移位和加法运算来代替。

例如:14 = 2 + 2^2 + 2^3,那么x*14 = (x << 3) + (x << 2) + (x<<1)

7、除以2的幂:逻辑右移、算术右移 + 偏置(之后再看)

 

【浮点数】

IEEE标准

1、二进制小数:与十进制小数机制类似

2、IEEE浮点表示:sign + exp + frac:

exp: 无符号数 - 偏置量 (偏置量为 2^(k-1) -1 )

float: 1 + 8 + 23

double: 1 + 11 + 52

技术分享

3、舍入与浮点运算(待填坑)

【CSAPP】二、信息的表示和处理