《深入理解计算机系统》第二章笔记(自用)

第二章 信息的表示和处理

1.信息存储

  1. 大多数计算机使用字节作为最小的可寻址的内存单位。

  2. 虚拟地址空间,所有虚拟内存的可能地址的集合,它是一个展现给机器级程序的概念性映像(具体见第九章 后补)。

  3. 十六进制表示法(hex):一个字节在二进制下的值域是00000000 ~ 11111111,在十进制下的值域是0 ~ 255,在十六进制下的值域是00 ~ FF。【基本知识点:进制之间的转换】

  4. 对于一个字长为w位的机器而言,虚拟地址的范围为0 ~ 2w-1。

  5. 我们将程序称为32位或64位,区别在于该程序是怎么编译的而不是其运行的机器类型。

  6. 数据类型int32_t(4字节)和int64_t(8字节)的引入,是为了固定数据大小。如果大小不同是会引发问题的,譬如在假设一个声明为int型对象来存储一个指针,在32位机上可以但在64位机上会出问题,因为64位机需要的是范围为16EB的指针。

  7. 【基本知识点:小端法和大端法】
    e.g.存int型变量0x01234567
    在这里插入图片描述

  8. 逻辑右移在左边补0,算术右移在左边补有效位。

  9. 可以利用数字的算数右移,然后利用0XFF这样的数字做掩码运算,可以获取到一个数字的符号位。计算机的移位运算有一种很重要的作用就是利用掩码运算去提取一个位模式的一段信息。

2.整数表示

  1. Tmin绝对值 = Tmax绝对值 + 1,也就是说 Tmin没有与之对应的正数。
    在这里插入图片描述

  2. 无符号表示中的Umax和补码表示的-1有相同的位模式,1+Umax=2w

  3. 当执行一个运算时,如果它的一个运算数是有符号的,另一个是无符号的,那么c语言会隐式地将有符号数强制类型转换为无符号数,并假设这两个数都是非负的,来执行这个运算。这对于像 < 和 > 这样的关系运算符来说,它会导致非直观的结果。e.g.比较式-1<0u,运算会被转成4294967295<0u,答案是0。

  4. 零扩展:将无符号数转换成为一个更大的数据类型时,在开头添加0
    符号扩展:将补码数字转换成为一个更大的数据类型,在表示中添加最高有效位的值

  5. 在这里插入图片描述
    截断后依然将最高为视为符号位

  6. 一个数据类型转换造成的错误
    在这里插入图片描述
    在这里插入图片描述

3.整数运算

  1. 执行c程序时,不会将溢出作为错误而发信号,但可以用s<x/s<y来判断无符号加法是否发生了溢出。

  2. 在这里插入图片描述

  3. 在这里插入图片描述

  4. 执行位级补码非的第一种方法是对每一位取反,再对结果加1。在C语言中,对于任意整数值x,计算表达式-x 和 ~x+1得到的结果完全相同。
    在这里插入图片描述

  5. x和y都是w位的无符号数,不管x*y的解决过需要用多少位来表示,c语言都会将结果截断为w位。
    在这里插入图片描述

  6. 补码乘法,截断为w位后再把结果转为补码
    在这里插入图片描述

  7. 左移一个数值等价于执行一个与2的幂相乘的无符号乘法。

  8. 对于某个常数K的表达式 x*K 生成代码,编译器会将K的二进制表示为一组0和1交替的序列(比如14可以写成[(0…0)(111)(0)]),考虑一组从位置n到m的连续的1(对于14来说n=3,m=1)我们可以用下面这两种方法来计算这些位对乘积的影响:
    在这里插入图片描述
    n=m时,选择A,否则选择B。

  9. 无符号的除法:移位总是舍入到零(例如771.25 舍入到 771)在这里插入图片描述

  10. 补码的除法:对于x >= 0 ,变量x的符号位为0,所以效果和逻辑右移是一样的。对于负数,会按照向下舍入(例如-771.25 会舍入到 -772)这个舍入可以依靠在移位之前偏置这个值来修正变成向上舍入,即把下面的移位式变成 (x+(1<<k)-1)>>k
    在这里插入图片描述

4.浮点数⭐

  1. 十进制小数转二进制:小数部分*2取整数位,直到小数部分为0.
  2. 在这里插入图片描述
    下图给出将这三个字段装进字中两种最常见的格式。在单精度浮点格式(C语言中的float)中,s、exp和frac字段分别为1位,k = 8位和n = 23位,得到一个32位的表示。在双进度浮点格式(C语言中的double)中,s、exp和frac字段分别为1位、k = 11位和n = 52位,得到一个64位的表示。
    在这里插入图片描述
    给定位表示,根据exp的值,被编码的值可以分为三种不同的情况(最后一种情况有两个变种)。
    在这里插入图片描述
    详细分类:
    【1】规格化的值:最普遍的情况,阶码的位模式(exp)既不全为0,也不全为1。这种情况下,阶码字段被解释为以偏置(biased)形式表示的有符号整数。也就是说,阶码值E = e - Bias,其中e是无符号数(是真正要存的exp),而Bias是一个等于2k-1-1的偏置值(单精度是127,双精度是1023)。小数字段frac被解释为描述小数值f(0<=f<1),尾数定义为M = 1 + f,这种方式也叫做隐含的以1开头的表示。这种情况表示的范围是单精度-126 ~ 127,双精度-1022 ~ 1023。
    【2】非规格化的值:阶码域全为0,这种情况下阶码值是E = 1 - Bias,而尾数的值是M = f,也就是小数字段的值,不包含隐含的开头的1。非规格化数有两个用途,其一是提供了一种表示数值0的方法,+0.0的浮点表示的位模式为全0,M=f=0,当只有符号位为1时,表示的是-0.0;其二是表示那些非常接近0.0的数,它们提供了一种属性称为逐渐溢出
    【3】特殊值:阶码域全为1,当小数域全为0时,表示无穷(s=0是+∞,s=1是-∞)当我们将两个很大的数相乘或者除以零的时候,无穷可以表示溢出。当小数域非零时,结果值称为NaN(Not a number)
    e.g.
    在这里插入图片描述
    在这里插入图片描述
  3. 四种舍入方式:向偶、向零、向上、向下。默认使用向偶舍入
  4. 浮点加法不具有结合性,这是缺少的最重要的群属性。
  5. 当在int、float、double格式之间进行强制类型转换时,程序改变数值和位模式的原则如下(假设int是32位的):
    🌙从int转成float,数字不会溢出,但是有可能被舍入
    🌙从int或者float转成double,因为double有更大的范围,也有更高的精度(有效位数),所以能够保留精确的数值
    🌙从double转换成float,因为范围要小一些,所以值可能溢出成正无穷或负无穷,另外,由于精确度较小,它还有可能被舍入
    🌙从float或者double转换成int,值会向0舍入
    e.g.讨论课例子
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值