经历了第一周的博客,以及第一周的课上测验之后,发现了自己在学习虚拟机的问题上还存在着很大的问题。所以从第二周的博客开始我加大了对教材的学习。
教材中的内容以及学习
信息的表示和处理
这一章主要研究的是在计算机上如何表示数字和其他形式数据的基本属性,以及计算机对这些数据执行操作的属性,要求我们对语言有一个更深入以及系统的学习。
首先预习以及研究的是十六进制表示法。在c语言中,以0x开头的常量被认为是十六进制的值。假设给定数字,可以通过展开每个十六进制数字,将它转换为二进制格式。如果反过来的话就是分成四位一个,重新转换为十六进制数。
接着是字数据大小的学习,每台计算机都有一个字长,指明指针数据的标称大小。虚拟地址的范围是0到2的n次方减1次幂。大多数64位机器也可以运行为32位机器编译的程序,可以用伪指令gcc -m32 prog.c
1.三种重要的数字表示区别
(1)无符号编码基于传统的二进制表示法,表示大于或者等于零的数字
(2)补码编码是表示有符号整数的最常见的方式,即可以为正也可以为负的数字
(3)浮点数编码是表示实数的科学记数法的以二为基数的版本。
2. 无符号数右移必须采用逻辑右移,而有符号数一般采用算术右移,C语言中的移位运算:对于无符号数据,右移必须是逻辑的,对于有符号数据,算数的或者逻辑的右移都可以。算数右移时,若最高位是1,填充的就是1。
3. 有符号数遇见无符号数会默认强转为无符号数。
4. 浮点加法和乘法不具备结合性,浮点乘法在加法上不具备分配性。
C语言中的有符号数和无符号数
由于C语言对同时包含有符号和无符号数表达式的这种处理方式,出现了一些奇特的行为。当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C语言会隐式地将有符号参数强制类型转换为无符号数,并假设这两个数都是非负的,来执行这个运算。
整数乘法的乘以常数
由于整数乘法比移位和加法的代价要大得多,许多C语言编译器试图以移位、加法和减法的组合来消除很多整数乘以常数的情况。
教材学习中的问题和解决过程
1.对于位位置n为最高有效位的情况,我们要怎么修改形式B的表达式?
刚开始在思考这个问题时,自己没有什么思路,在网上搜索时,才恍然大悟,表达式变成了-(x<<m) 另外要设字长为w,n=w-1,这样我们可以说是将x左移w位得到。
- 有符号数和无符号数之间的转换,所谓转换,只是针对某个n位的数,换一种解释的方式,并不改变位值。
C语言在对同时包含有符号数和无符号数的表达式时,隐性把有符号数转成无符号数,再进行计算。
书中说:这个对标准的算术运算,结果和直观无多大差异,只对和有差异,但我的测试结果明显不对:
if (-1 < 0u)
{
int i = 0;
}
else
{
unsigned int a = 2147483648;
// 0x80000000;
int c = -2147483647;
//
0x80000001
int j = c - a;
//
j结果是1
int k = 0;
}
最后得出的结论就是:尽量不要互转,除非你确定任何数值都没有问题。具体分析就是一步一步来,反正规则就是转换只改变解释方式,不改变位值,并且默认有符号转无符号。
代码调试中的问题和解决方法
首先自行编译书上的代码然后发现编译不过。
然后发现是因为缺少了主函数。
代码托管(https://gitee.com/nhx19970709/projects)
学习与感悟
第二章学习的内容感觉十分的晦涩难懂,而且第二章是更偏向计算机方面的知识。在做云班课的题目时,我们可以发现更多的题目是注重基础的。而第二章的基础概念非常多,所以说从这章开始,我们就要更加注重基础概念的学习。在虚拟机中学习本身就不是一件容易的事,另外学习这么多的知识,不下大力度是不能完成的。所以在课下应该花大时间来看书与学习。基础概念的学习是至关重要的,只有了解好概念,我们才能好好地编译代码。
学习时间条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 10 /10 | 1/1 | 10/10 | |
第二周 | 40 /70 | 2/4 | 18/38 | |
第三周 | 150/200 | 3/7 | 15/60 |
参考:软件工程软件的估计为什么这么难,软件工程 估计方法
计划学习时间:13小时
实际学习时间:17小时
改进情况:多提出问题,多解决问题。
(有空多看看现代软件工程 课件 软件工程师能力自我评价表)
参考资料
《深入理解计算机系统V3》学习指导
...