目录
11.2.3 规格化、非规格化、无穷大、NAN(不同编码的形式)
系列文章目录
本系列博客重点在深圳大学计算机系统(2)课程的核心内容梳理,参考书目《深入理解计算机系统》(有问题欢迎在评论区讨论指出,或直接私信联系我)。
第一章 深入理解计算机系统01——计算机系统漫游_@李忆如的博客-CSDN博客
第二章 深入理解计算机系统02——信息的表示与处理
梗概
本篇博客主要介绍深入计算机系统书目第二章信息的表示与处理的相关知识。
一、信息存储
1.先导知识与概念
① 大多数计算机使用8位的块(bit),或者字节,作为最小的可寻址的内存单位。
② 万物皆位,每一位都是0或1(易于电子实现),通过各种方式编码/解释比特集。
2.十六进制表示法
对于位模式的描述来说,二进制表示法过于冗长,十进制表示法与位模式的互相转换很麻烦。替代的方法是,以16为基数(十六进制数),来表示位模式。
2.1 进制转换
十六进制转十进制:对应位乘上16的对应平方与数
十进制转十六进制:辗转相除,从底往上
3.字数据大小
每种结构的计算机都有固定长的二进制位作为一个字,用于指明整数与指针数据的标称大小。属于硬件概念,常见的有32位与64位字长两种。
Tips:可利用sizeof()输出某数据类型对应的字节。
尤其注意不同系统下不同的类型(long、pointer)
4.寻址与字节顺序
4.1 寻址
程序寻址——逻辑地址、虚地址(以数据的第一个字节为地址)
Tips:一个地址占用一个字节(8bits)
4.2 字节顺序(大端法小端法)
假设变量的类型为int,位于地址0x100,十六进制值为0x01234567
C语言验证代码如下:
#include<stdio.h>
int main(){
int num = 0x01234567;
char *c = (char *)#
if(*c == 0x01)
printf("big");
else if (*c == 0x67)
printf("small");
}
4.3 编译选项
5.表示字符串与代码
① 字符串编码
字符串被编码为以null(值为0)结尾的字符数组,每个字符为ASCII码。
例 “123456” = “31 32 33 34 35 36 00 ”
② 表示代码
使用机器语言编码表示,二进制编码互不兼容(不同系统)。
6.布尔代数
Tips:确定是逻辑运算还是按位运算。
7.C语言中的移位运算
符号:<< 与 >> 加数字表示移动的位数
左移:按位左移并在右端补0
右移
① 逻辑右移:按位右移在往左端补0(对无符号整数使用)
② 算数右移:按位右移在往左端补最高位有效值(对有符号整数使用)
8.整数表示
整形数据类型表示有限范围的整数,大小与类型、机器有关(负数范围比正数大1)。
8.1 无符号整数
映射一一对应,没有二义性。
8.2 补码编码(有符号)
8.3 无符号数与有符号数的转换
Tips:2的31次方 - 1 = 2147483647
默认是有符号数,且有符号数优先级较高,无符号数声明在数后加U。
转换:位模式不变,只改变值。
表达式(包括比较)中若同时存在有符号数与无符号数,有符号数隐式转换为无符号数。
Tips:C99(一般)与C90的编码缺省不同,有可能比较结果不同。
9.数位的扩展与截断
9.1 数位扩展
① 无符号数按零扩展
② 有符号数按最高位数扩展
9.2 数位截断
直接删除前k位数,得到的新数按原类型(有无符号)解释。
Tips:加减运算要注意数位的范围,超出范围出现截断(运算的有限性)。
10.整数运算
Tips:数位的范围对运算很重要(溢出问题)!
10.1 无符号整数加法
10.2 有符号整数加法
10.3 整数的乘运算(左移)
高级语言中两个n位数相乘,结果通常也为n位数,即结果只取乘积2n位中的低n位。
10.4 乘常数
Tips:整数乘法比移位和加法代价大很多。
10.5 例题
移位代码存在问题
① 申请空间可能出现乘法溢出 导致申请空间不足
② 未释放空间
③ 做移位操作从低位开始可能会覆盖原本高位数据(空间连续且过小时)
④ 使用连续的存储空间存储信息有安全漏洞,可以用预设信息覆盖原信息实现入侵甚至盗取root权限。
10.6 无符号数除2的幂
直接逻辑右移幂位即可。
11.浮点数
Tips:在数轴上比整数更稀疏
11.1 浮点数的表示及转换
Tips:某些浮点数(eg.0.1)在计算机内不能精确表示(eg.3.1f + 2.1f != 5.2f)会丢一些有效位
精确表示的限制
① 只能精确表示x/2的k次方
② 在w位中只能设置一个二进制点
Tips:有效数位越高,精度越高。
11.2 IEEE表示
11.2.1 数值形式
11.2.2 编码
Tips:偏置值 = exp(无符号) - (2的7/10次方 - 1)
11.2.3 规格化、非规格化、无穷大、NAN(不同编码的形式)
11.2.4 IEEE例题
① 十六进制转十进制
② 十进制转十六进制
Tips:尾数部分记得省1。
11.3 舍入
最常见的舍入为偶数舍入,有两个原则,一是向最接近的值舍入,再一个是当处在"中间值"时看有效数值是否是偶数,如果是偶数则直接舍去不进位,如果是奇数则进位。
11.4 浮点数加法
阶码对齐,尾数相加,规格化,若超过有效位进行舍入。
Tips:题目假设有效位为三位,使用了偶数对齐舍入。
11.5 浮点数乘法
与加法类似。
11.6 整数与浮点数的转换
数的范围:double > float > int
11.7 浮点数与整数例题
判断下列表达式是否永真
Tips
① 浮点数溢出不会改变符号位
② 2/3 2/3.0与c语言一样
③ 只有int与float转化成double才能完美转换 不出现舍入与溢出。
④ double与float 舍入规则不一样(前者为64位 后者为32位 舍入位数不一样)
12.练习题
书中第二章练习题需做如下:
总结
以上便是《深入理解计算机系统》第二章——信息的表示和处理的核心知识。在第二章中,重点涉及了C语言中的各种运算及概念,整数、浮点数的各种表示与运算。