【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、舍入与浮点运算(待填坑)