课程简介
这门课很适合从学生到工作的转变。非常喜欢Cain, Jerry老师的讲课风格,学到了很多东西。大家可以从B站 和官网找到相关的学习资料。
一、Lecture1
lecture1是介绍本次课程的大纲。本次课程的内容涉及到C++(面向对象范式),C(程序范式),汇编,并发编程,函数范式,Python.
二、Lecture2
1.数据类型
数据类型 | Size |
---|---|
bool | |
char | 1 bytes |
short | 2 bytes |
int | 4 bytes |
long | 4 bytes |
float | 4 bytes |
double | 8 bytes |
其中bool类型比较特别课程中也没有详细解释,我查阅了《c++ primer》上面写的是未定义。其实这些数据类型也是根据不同的机器人为的定义的,例如int在不同的平台和编译器上长度是不一样的,有2 bytes, 4bytes等
1.1 如何用计算机保存负数
计算机是通过补码来保存负数的,Cain, Jerry老师关于补码的讲解非常精彩,因为我看过好多书都是干巴巴地把补码的概念直接写出来让大家记住,可能是为了方便考试吧。其实为什么用补码,是因为补码有很多方便的地方。比方说为了实现(-1) + 1 = 0这个操作吧。举个例子(其实非常建议看视频的,因为老师讨论的很详细)
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |
---|---|---|---|---|---|---|---|---|
+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
= | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
通过简单的二进制运算和数据溢出,上面的式子就成立了。因为计算机是这样计算的,所以我们使用
1111111
1
(
2
)
=
−
1
11111111_{(2)} = -1
11111111(2)=−1的补码表示方式。通过高中学的等比数列求和公式可知:以2为公比的数列求和公式为
2
n
−
1
2^n - 1
2n−1. 当采用补码的时候,即最高位的权重为
−
2
n
-2^n
−2n时,
−
2
n
+
2
n
−
1
=
−
1
-2^n + 2^n -1=-1
−2n+2n−1=−1。
这里还可推到出来一个非常有用的公式:
∼
x
+
x
=
−
1
\sim x + x = -1
∼x+x=−1。有没有很熟悉,好多课本上写的是
−
x
=
∼
x
+
1
-x = \sim x + 1
−x=∼x+1。
1.2 不同数据类型之间的转换
我们可以通过代码去练习一下Cain, Jerry老师上课写的例子。我使用的是VS2019开发环境。
#include <iostream>
#include <math.h>
using namespace std;
int main() {
/*
float f = 7.0;
short k = *(short*)&f;
cout << k << endl;
*/
char ch = 'A';
short s = ch;
cout << "输出'A'对应的ASCII" << endl;
cout << s << endl;
s = 67;
ch = s;
cout << "输出ASCII:67对应的符号" << endl;
cout << ch << endl;
//考虑数据溢出
s = 67 + 256;
ch = s;
cout << "丢掉溢出的位数" << endl; //其实这里还会涉及到不同机器之间的大端法和小端法的区别,这里是小端法表示.
cout << ch << endl;
int i = pow(2, 23) + pow(2, 21) + pow(2, 14) + 7;
s = i;
cout << "丢掉溢出的位数" << endl;
cout << s << endl;
//符合扩展
s = -1;
i = s;
cout <<"按照符号位扩展,保证i = -1" <<endl;
cout <<i <<endl;
//float
float f = 7.0;
return 0;
}
解释一下为什么int i =
2
23
+
2
21
+
2
14
+
7
2^{23} + 2^{21} + 2^{14} + 7
223+221+214+7转化为short后,s = 16391,这里为了表示的方便,我用十六进制表示数据。
- i用十六进制表示i = 00A04007,
- 小端法存储0740A0,
- 转short s的存储为0740,
- 通过小端法解释 s =
400
7
16
4007_{16}
400716 = 16391.
1.3 重点
float f = 7.0;
short s = *(short *) &f;
Cain, Jerry老师强调这个公式是这门课程核心特色。我们可以按照下边的分析一步步理解。
&f //取f的地址
(short *) &f //强制类型转换
*(short *) &f //解引用
在《深入理解计算机系统》这本书中,强调了一个概念,所谓的内存可以抽象为一个很大数组。目前以我的理解,其实指针可以抽象这个数组的下标,存储数据的地址。我们可以按照我们的方法去解释,管理这些数据。
1.4 小技巧-vs查看内存
因为受到大端法和小端法的不同,机器位数的不同,会出现一些看似与Cain, Jerry老师讲的不一样。例如一些结果运行出来会不一样。但不要担心肯定不是Cain, Jerry老师讲错了。我们应该学习Cain, Jerry老师讲的知识,而不是这些细节。为了解决这个问题,我们可以通过VS去查看内存,自己分析,这样才是真的学会了。