信息存储

十六进制表示法

(略)

字数据大小

  • 大多数计算机使用8bit的块(字节)作为最小的可寻址的内存单元
  • 字长指明了指针数据的标称大小(?)
  • 64位系统和32位系统向后兼容
  • C语言中有些数据类型的具体大小依赖于程序的编译,C99引入int32_tint64_t类型,指明数据的长度
  • C标准对不同数据类型的数字的范围设置了下界,没有设置上界

寻址和字节顺序

  • 存储规则:对象的地址是什么?在内存中如何排列这些字节?
  • 地址:多字节对象的存储地址为连续字节序列的最小字节地址
  • 排列方式:
    • 小端法:低字节存在低地址
    • 大端法:低字节存在高地址
    • 默认规则:书写时,地址从左往右表示从低到高,字节从左往右表示从高到低

  • 关心字节顺序的场合:

    • 网络数据传输
    • 阅读字节序列
    • 规避正常的类型系统,比如强制类型转换或者联合允许一种数据类型引用一个对象
  • 代码示例:按字节读取内容
//按照字节打印数据中的内容
#include<bits/stdc++.h>
using namespace std;
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len){
int i;
for(i = 0; i < len; ++i){
printf(" %.2x", start[i]);
}
printf("\n");
}
void show_int(int x){
show_bytes((byte_pointer)&x, sizeof(int));
}
int main(){
int num;
cin >> num;
show_int(num);
return 0;
}

字符串的表示

  • 用ASCII码表示
  • ASCII码只能表示英文字符,更一般的字符采用Unicode

代码表示

  • 二进制代码不兼容,即不同系统上编译得到的二进制代码不同

布尔代数

  • 运算:与、或、非
  • 位向量
  • 位向量表示有限集合

C语言中的位运算

  • 将十六进制转换为二进制执行二进制运算,然后将结果转换为十六进制

C语言中的逻辑运算

  • 0表示false,非0表示true
  • 与位运算的不同:
    • 位运算的参数是0或1
    • 逻辑运算有短路原则

C语言中的移位运算

\([x_{\omega - 1}, x_{\omega - 2}, ..., x_0]\)

  • 左移:高位舍弃,低位补0 $ [x_{\omega - 1 - k}, x_{\omega - 2 - k}, ... x_0, \underbrace{0, \cdots, 0}_{k个}]$
  • 右移:
    • 算数右移:补符号位 \([\underbrace{x_{\omega - 1}, ..., x_{\omega -1}}_{k个}, x_{\omega -1}, x_{\omega - 2}, ..., x_k]\)
    • 逻辑右移:补0 \([\underbrace{0, ..., 0}_{k个}, x_{\omega - 1}, ..., x_k]\)

整数的表示

整型数据类型

  • 典型实现中,负数比正数多1个
  • C语言标准中规定(1)固定了数据大小(2)正数和负数对称

数据编码

假设整型数据类型有\(\omega\)位,将其表示记作位向量\(\vec x = [x_{\omega - 1}, x_{\omega - 2}, \cdots, x_0]\)

无符号数编码

  • 定义:
\[B2U_{\omega}(\vec x)=\sum_{i=0}^{\omega - 1} x_i 2 ^ i
\]
  • 范围:\(Umax = \sum\limits_{i = 0}^{\omega - 1} 2 ^ i = 2 ^\omega -1\)

  • 示例:

  • 定理:\(B2U_\omega(\vec x)\)是一个双射

补码表示

  • 定义:

    \[B2T_{\omega}(\vec x) = -x_{\omega - 1}2^{\omega - 1} + \sum_{i = 0}^{\omega - 2}x_i 2 ^i【注】补码表示中,最高位被理解为负权
    \]

    【注】补码表示中,最高位被理解为负权

  • 范围:\(Tmin = -2^{\omega - 1}, Tmax = \sum\limits_{i = 0} ^ {\omega - 2}2 ^ i = 2 ^{\omega - 1} - 1\)

  • 示例:

  • 定理:\(B2T_\omega(\vec x)\)是一个双射

【注】

  • 补码的范围中:\(\vert Tmin\vert = \vert Tmax\vert + 1\)

  • 补码和无符号数:\(Umax = 2Tmax + 1\)

  • 所有机器都将有符号数表示为补码,尽管C语言标准没有明确规定

反码表示

  • 定义:
    \[B2O_{\omega}(\vec x) = -x_{\omega - 1}(2^{\omega - 1} - 1) + \sum_{i = 0}^{\omega - 2}x_i2^i
    \]

原码表示

  • 定义:
\[B2S_\omega(\vec x) = (-1)^{x_{\omega - 1}}\times \sum_{i = 0}^{\omega - 2}x_i2^i
\]

有符号数和无符号数之间的转换

  • C语言强制类型转换:不改变位级表示,只改变位的解释方式

补码转无符号数

  • 补码转为无符号数:

    \[T2U_\omega(x) = \begin{cases}
    x + 2 ^\omega & x < 0,\\
    x & x \geq 0
    \end{cases}
    \]
  • 推导:

\[\begin{align}
B2U_\omega (\vec x) - B2T_\omega(\vec x) &= x_{\omega - 1}2^\omega
\Longrightarrow B2U_\omega(\vec x) = x_{\omega - 1}2^\omega + B2T_\omega(\vec x)\\
T2U_\omega(x) &= B2U_\omega(T2B_\omega(x)) \\
&= x_{\omega -1}2^\omega + B2T_{\omega}(T2B_\omega)(x)\\
&= x_{\omega- 1}2^\omega + x
\end{align}
\]
  • 理解:将补码中最高位解释为负权变为解释为正权,将补码看做无符号数时,正数不变,负数变为一个更大的数
  • 示例:

无符号数转补码

  • 转换:
\[U2T_{\omega}(x) = \begin{cases}
u & u \leq Tmax_\omega \\
u - 2 ^ \omega & u > Tmax_\omega
\end{cases}
\]
  • 推导(同补码转无符号数)

总结

C语言中的有符号数和无符号数的转换

  • C语言中默认数字都是有符号
  • 声明一个无符号常量需要在数字后面缀上‘U’
  • 一个运算中同时出现有符号数和无符号数时,会被隐式转换为无符号数

扩展数字的位表示

无符号数的0扩展

  • \(u_\omega = [u_{\omega -1}, \cdots, u_0]\longrightarrow u'_{\omega + k} = [\underbrace{0, \cdots, 0}_{k个}, u_{\omega -1}, \cdots, u_0]\)

补码的符号扩展

  • 定义
\[x_\omega = [x_{\omega - 1}, \cdots, x_0]\longrightarrow x'_{\omega + k} = [\underbrace{x_{\omega-1}, \cdots, x_{\omega - 1}}_{k个}, x_{\omega - 1}, \cdots, x_0]
\]
  • 推导
    \[\begin{align}
    B2T_{\omega + 1}(\vec x') &= -x_{\omega -1}2^\omega + \sum_{i = 0}^{\omega - 1}x_i2^i\\
    &= -x_{\omega - 1}2^\omega + x_{\omega -1}2^{\omega - 1} + \sum_{i=0}^{\omega - 2}x_i 2^i\\
    &= -x_{\omega - 1}2^{\omega -1}+\sum_{i=0}^{\omega - 2}x_i 2^i\\
    &= B2T_\omega(\vec x)
    \end{align}
    \]

截断数字的位表示

无符号数的截断

  • 定理
\[\vec x = [x_{\omega -1 }, \cdots, x_0], \vec x' = [x_{k-1}, \cdots, x_0]\\
x' = x \mod 2^k
\]
  • 推导:截断的部分对应的位权为\(2^{k}, \cdots, 2^\omega\)

补码的截断

  • 定理
\[\vec x = [x_{\omega -1 }, \cdots, x_0], \vec x' = [x_{k-1}, \cdots, x_0]\\
x' = U2T_k(x\mod 2^k)
\]
  • 推导:以无符号数为中介

整数的运算

无符号数加法

  • 定义运算\(+_\omega^u\),将无符号数\(x, y\)相加后截断\(\omega\)位,可以视作是一种模运算
  • 无符号数加法:

对于满足\(0\leq x, y < 2^\omega\),有:

\[x+_\omega^u y = \begin{cases}
x + y & x + y < 2 ^ \omega \\
x + y - 2 ^ \omega & x + y \geq 2 ^\omega
\end{cases}
\]



  • 溢出判断:对于\(s = x+_\omega^uy\),当且仅当\(s < x\quad or\quad s < y\)时发生溢出
  • 无符号数求反:模数加法形成了一个阿贝尔群,定义\(x\)的反为:
\[-_\omega^u x = \begin{cases}
x & x = 0\\
2^\omega - x & x > 0
\end{cases}
\]

补码加法

  • 定义运算\(+_\omega^t\),将有符号数\(x, y\)相加后截断\(\omega\)位,可以视作是一种模运算
  • 补码加法:
\[x+_\omega^t y=\begin{cases}
x+y-2^\omega & 2 ^{\omega - 1} \leq x + y\\
x+y & -2^{\omega -1 } \leq x + y < 2 ^{\omega -1}\\
x+y+2^\omega &x + y < -2^{\omega -1}
\end{cases}
\]

【注】还是来源于截断,当没有溢出时,不发生截断;溢出的情况只会是“正+正”或者“负+负”;“正+正”溢出时,符号位为0,数字部分的最高位变为1(进位导致增加的数字),截断后原有的符号位会被丢弃,符号位变为1,真实的值为\(x+y=2^{\omega -1} + \sum\limits_{i=0}^{\omega -2}x_i2^i\),截断后的值为\(x+_\omega^t y- = 2^{\omega -1} + \sum\limits_{i=0}^{\omega -2}x_i2^i\),因此\(x+_\omega^t y = x + y - 2^\omega\);负溢出解释相似。

  • 推导:

有符号和无符号具有相同的位级表示,因此先将参数转换为无符号数,然后按照无符号数运算,最后将结果转换为补码

\[\begin{align}
x+_\omega^u y &= U2T_\omega(T2U_\omega(x) + T2U_\omega(y))\\
&= U2T_\omega((x_{\omega-1}2^\omega + y_{\omega - 1}2^\omega+x+y)\mod 2^\omega)\\
&= U2T_\omega((x+y)\mod 2^\omega)
\end{align}
\]

记\(z=x+y, z' = z\mod 2^\omega, z'' = U2T_\omega(z')\)

若\(-2^{\omega}\leq z < -2^{\omega-1}\),则\(z'=z+2^\omega\),因此\(0\leq z' < 2^{\omega -1}\),故\(z''=z'\)

其余三种情况以此类推

  • 补码加法溢出判断:“正+正=负”或者“负+负=正”

补码的非

  • 定义:对于满足\(Tmin\leq x \leq Tmax\)的\(x\)
\[-_\omega^tx=\begin{cases}
Tmin &x = Tmin\\
-x & x>Tmin
\end{cases}
\]
  • 根据位级表示计算补码的非:

    • 各位取反再加1:-5=[1011], [0100] + [0001] = [0101] = 5
    • 将符号位(包含符号位)与最后一个1之间的位取反:5=[0101], [1011] = -5

无符号乘法

  • 定义:\(x*_\omega^uy=(xy)\mod 2^\omega\)

补码乘法

  • 定义:\(x*_\omega^t y=U2T_\omega({(xy)\mod 2^\omega})\)
  • 无符号和补码乘法的位级等价性

给定长度为\(\omega\)的位向量\(\vec x, \vec y\),用补码形式定义的整数为\(x, y\),用无符号定义的整数为\(x', y'\),则:

\[T2B_\omega(x*_\omega^t y) = U2B_\omega(x'*_\omega^u y')
\]

证明

\[\begin{align}
(x'*y')\mod 2^\omega &= ((x_{\omega -1}2^\omega+x) \cdot (y_{\omega -1}2^\omega + y))\mod 2^\omega\\
&= (xy)\mod 2^\omega\\
T2U_\omega(x*_\omega^t y)&=T2U_\omega(U2T_\omega((x\cdot y)\mod 2^\omega))\\
&= x\cdot y \mod 2^\omega\\
T2B_\omega(x*_\omega^t y)&=U2B_\omega(T2U_\omega(x*_\omega^t y))\\
&=U2B_\omega((x\cdot y)\mod 2^\omega)
\end{align}
\]

乘常数

  • 乘2的幂:\(x\cdot 2^k = x << k\)
  • 乘以常数K:将常数K分解为{0,1}序列,然后通过移位和加法
  • 计算\(x\cdot K\)
    • 分解K:\(K = [(0...0)(1...1)(0...0)...(1...1)]\)
    • 计算:考虑从\(n\)位到\(m\)位(\(n \geq m\))为连续的1,有两种计算方案:
      • \((x<<n) + (x <<(n-1))+...+(x<<m)\)
      • \((x<<(n+1)) - (x<<m)\)

除以2的幂

  • 对于无符号数,\(x>>k\)产生数值\(\lfloor x/2^k\rfloor\)

  • 对于有符号数

    \(x>0\)时同无符号数

    \(x<0\)时,\(x>>k\)产生数值\(\lfloor x/2^k\rfloor\),\((x+(1<<k) - 1)>>k\)产生数值\(\lceil x/2^k\rceil\)

  • 偏置的设计:

    注意到\(\lceil x/y\rceil = \lfloor (x+y-1)/y\rfloor\),设\(x = qy+r\),因此\(\lfloor (x+y-1)/y\rfloor=q+\lfloor(r+y-1)/y\rfloor\),当\(r\)为0时,后面一项为0,当\(r>0\)时后面为1。取\(y=2^k\),即可得到带偏置的除法公式

【计算机理论】CSAPP ch2的更多相关文章

  1. 《计算机组成原理/CSAPP》网课总结(一)

    现在是2022年4月17日晚10点,本月计划的网课<csapp讲解>视频课看到了第八章"异常"第三讲,视频讲的很好但更新很慢,暂时没有最新的讲解,所以先做一个简单总结. ...

  2. 深入理解计算机(CSAPP)资源汇总

    用于资源记录. 视频: 卡内基梅隆大学 Introduction to Computer Systems CMU 15-213 Fall 作业(labs): Lab Assignments

  3. 《计算机组成原理/CSAPP》网课总结(二)——编译原理基础

    这部分是四月份的安排,拖到五一放假了,主要是对源码编译过程的一次总结,总的来说,大致可分为预编译.编译.汇编和链接四部分.这里简单记录一下: 一 概述 1.预处理 或者说是预编译,指的是在编译前需要做 ...

  4. 计算机专业-世界大学学术排名,QS排名,U.S.NEWS排名

    2015年美国大学计算机专业排名 计算机专业介绍:计算机涉及的领域非常广泛,其分支学科也是非常多.所以在美国将主要的专业方向分为人工智能,程序应用,计算机系统(Systems)以及计算机理论(theo ...

  5. 计算机与linux操作系统的发展

    一.计算机 (一)计算机的概念 1.概念:计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按照程序运行,自动.高速 ...

  6. 这个大学在Github开源了计算机课程,看完在家上个 985

    微信搜「后端技术学堂」有干货,本文已收录于Github:https://github.com/imcoderlemon/CodeClass 内含原创干货文章,千本计算机电子书,3本LeetCode题解 ...

  7. 三月总结&四月计划

    三月总结 1. 主要任务 <C++设计模式>网课 ① 进展: 看完,对设计模式的整体设计思路和几个重要的设计模式重点学习了一下,目前对设计模式的认识还比较浅 ② 总结: 做完总结 ③ 反思 ...

  8. 一个人的 ClojureScript 技术栈

    作者:题叶链接:https://zhuanlan.zhihu.com/p/24425284来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.今天(昨天)分享完关于 Cloj ...

  9. [Z]CS权威会议

    CS Conference TOP 40 计算机会议TOP40 一.A 类 15 个 ASPLOS: Architecture Support for Programming Languages an ...

随机推荐

  1. CF1095B Array Stabilization 题解

    Content 有一个长度为 \(n\) 的数组 \(a_1,a_2,a_3,...,a_n\),现在需要从这些数中删除一个数,使得 \(\max\limits_{i=1}^na_i-\min\lim ...

  2. AcWing422. 校门外的树

    题目: 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米. 我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,--,L,都种 ...

  3. SpringBoot整合quartz实现动态启动,停止定时任务功能

    注意:这个方法当程序重启之后会失效,所以必须将定时任务持久化到数据库,然后程序启动的时候重新把数据库的定时任务加载到quartz中 springboot程序启动初始化代码参考:https://www. ...

  4. 【LeetCode】1018. Binary Prefix Divisible By 5 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. 【LeetCode】367. Valid Perfect Square 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:完全平方式性质 方法二:暴力求解 方法三:二 ...

  6. 【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 一个栈用来保存输入,一个栈用来输出 日 ...

  7. 《HelloGitHub》第 69 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  8. 【感悟】观《BBC彩色二战纪录片》有感

    2020年7月2日到3日我看了纪录片,以下是我的一些感悟 1.作为进攻者,无论大事还是小事都需要一鼓作气做完,以免留给对手喘息的机会.(指:未消灭) 2.作为防守者,要有顽强抵抗的精神,但要保留撤退的 ...

  9. matplotlib 进阶之origin and extent in imshow

    目录 显示的extent Explicit extent and axes limits matplotlib教程学习笔记 import numpy as np import matplotlib.p ...

  10. matplotlib 进阶之Artist tutorial(如何操作Atrist和定制)

    目录 基本 plt.figure() fig.add_axes() ax.lines set_xlabel 一个完整的例子 定制你的对象 obj.set(alpha=0.5, zorder=2), o ...