学习资料:【CSAPP-深入理解计算机系统】
二、信息的表示和处理
信息的存储
(1)Byte
(2)十六进制
【可以记住ACF快速得到其他】
(3)二进制数与十六进制数的快速转化
【借助0的个数】
(4)字长
(5)32位机器与64位机器
【大多数64位的机器做了向后兼容】
【hello32即能在32位机器上运行,又能在64位机器上运行】
【hello64只能在64位机器上运行】
【主要在于程序是如何编译的,而不是机器的类别】
(6)不同数据类型在不同机器上占用字节
(7)数据在内存中的排布
【大端法:最高有效字节存储在最前面,也就是地址处】
【小端法:最低有效字节存储在最前面】
【大多数intel:小端 大多数IBM/Sun:大端】
(8)布尔运算
【位级运算】
【逻辑运算】
【移位运算】
【左移:右边补0】
右移:逻辑右移 / 算术右移
【有符号数:算术右移 无符号数:逻辑右移】
整数表示
(1)无符号编码
【B2U:binary to unsigned 二进制数转无符号数】
【图形化】
“权重”
(2)补码
【负权重】
(3)无符号数最大值
(4)有符号数最大值
(5)有符号数的最小值
(6)特殊的数值
【几乎所有机器都是用补码表示有符号数】
(7)无符号数与有符号数之间的转化
【对于C语言来说,转化前后位模式不变,解释这些位的方式改变了】
【在C语言中,若存在有符号数与无符号数之间的运算,则C语言会隐式的将有符号数强制转换位无符号数来执行运算】
(8)符号位扩展
(9)截断有符号数
整数的运算
(1)无符号加法
【C语言】判断溢出
(2)有符号加法
溢出判断
(3)无符号数的逆元
(4)有符号数的逆元
(5)无符号乘法
(6)补码的乘法
【需要将无符号数转成补码】
(7)向零舍入
(8)无符号数除法
(9)补码的除法(除以2的k次幂)
【想要得到向零舍入的结果,需要加入偏置量,偏置量为 2的k次方-1 】
【不能推广到任何常数】
浮点数
(1)浮点数的表示(IEEE)
(2)浮点数的表示类型
(3)规格化
(4)非规格化
【表示非常接近零的数】
(5)特殊值
(6)舍入
【向偶数舍入,若处于舍入的正中间,只需要考虑最低有效位是偶数还是奇数
比如:1.5 -> 1 / 2 2是偶数,所以结果为2
2.5 -> 2 / 3 2是偶数,所以结果为2 】
(7)浮点数的运算
【浮点数的加法和乘法都不具有结合性、浮点的乘法在加法上不具有分配性】
(8)类型转化
int - > float : 不会溢出,可能会舍入,无法保留精度
int / float - > double : 可以保留精度
double - > float : 发生溢出 / 舍入
float / double - > int : 向零舍入 / 发生溢出