斯坦福大学公开课:编程范式(一)
来源:互联网 发布:蟑螂药哪种最好用 知乎 编辑:程序博客网 时间:2024/05/09 09:08
听了这第二讲,感觉学到了很多东西;首先的一个感受就是这个老师是在引导你进行思考,而不是像中国的教师一样,只教你如何计算一个数的二进制表示,如何取反码。
所谓的char,short,int只是对内存字节的不同解释而已。
(1) 二进制加法(不考虑负数)
short s1 = 3; 0000 0011
short s2 = 1; 0000 0001
相加结果: 0000 0100(4)
(2)那么如何来表示一个负数呢? 最高位表示符号位,这个我们清楚,那么最容易想到的是,正数和负数只有符号位不相同,其他为都一样,那么这样是否可以呢?
short s1 = 3; 0000 0011 (为了表达方便,我们这里假设short是一个字节)
short s2 = -3; 1000 0011
按照我们的思路,结果是:1000 0110(-6),如果我们的假设是对的,那么这里3 + (-3)的结果就应该是1000 0011(-6),显然假设是不正确的。
从上面的计算过程可以看出,如果我们寻找一个数的相对负数,那么这两个数的二进制加法的结果应该是0(0000 0000)
short s1 = 3; 0000 0011
short s2 = -3; xxxx xxxx
很显然我们没有方法使用二进制加法让这两个数的相加得到0000 0000。
但是我们知道上面的每一个二进制位,在内存中都是一个bit,更深入点,是用电子元器件电压的正负分别表示该位是1、0的;如果我们给1111 1111这个元器件的最低位再加上一个正电压,会怎么样呢?
1111 1111
0000 0001
结果 0000 0000
结果就是这八位全部变成了0,当然最高位有个1,已经没有地方保存这个1了,所以最后的结果变成了0。
因此我们想到将上面的xxxx xxxx部分用1111 1100,这样
short s1 = 3; 0000 0011
short s2 = -3; 1111 1100
二进制加法: 1111 1111
如果再给它加1: 0000 0001
结果: 0000 0000
因此,这就是为什么一个数的相反数的二进制表示是:它的所有二进制位取反,然后再加1的原因。(正数的相反数这么算,负数的相反数也这么算)
(3) char c = 'A';
short s = c;
cout << s << endl;
字符'A'在内存中表示为:0100 0001(8位)
在char类型(8位)向short类型(16位)赋值时会进行“符号扩展”,也就是高位用符号位填充的意思。
(4)浮点数的表示是怎样的呢?
我们首先想到的是aaabbbb这种形式,默认aaa表示小数点前面的整数,bbbb表示小数点后面的分数,这样很通俗易懂,但是表示一个稍微大一点的数,就会消耗很多很多的
二进制位。因此浮点数的表示是有协议的,协议就是规定,定好的,因为这样可以用很少的字节表示很大的数。
以32位浮点数为例:
符号位1位(s) 8位指数(exp) 23位小数(x)
1.x * 2(exp -127) ------------此处是2的幂次方。
(5)下面的代码会输出什么呢?
float f = 10.0;
int s = *(int *)&f;
cout << s << endl;
结果是:1092616192 (上面的处理方式是把浮点数在内存中保存的32位二进制位,当做32位二进制整数进行处理)
float f = 10.0;
short s = *(short *)&f;
cout << s << endl;
如果把int改成short位出现什么情况呢?
假设float f在内存中表示为xxxx xxxx yyyy yyyy,我们知道short只有16位,那么是输出的x还是y呢?
我们知道指针指向的是开头的地址,所以输出x。
float f = 10.0;
short s = f ;
cout << s << endl;
这个会输出什么呢? 结果是10。此处就属于强制转换的范畴了。
- 斯坦福大学公开课:编程范式(一)
- 斯坦福大学公开课:编程范式 C/C++基础
- 批量下载:斯坦福大学公开课-编程范式,来源:网易公开课
- 斯坦福大学公开课《编程方法学》之笔记一
- 斯坦福大学-公开课-编程方法学
- 斯坦福大学开放课程--编程范式(四)
- 斯坦福大学公开课《编程方法学》之笔记一的材料补充
- 斯坦福大学开放课程:编程范式学习笔记《一》
- 斯坦福大学公开课
- 斯坦福大学公开课:广义相对论
- 斯坦福大学公开课
- 斯坦福大学公开课 编程方法学 Breakout 解题思路
- 斯坦福大学公开课:编程方法学 (cs106A) 资源
- 《斯坦福大学公开课:编程方法学》观后有感
- 斯坦福大学公开课-编程方法学-第四节(计算机科学发展史)
- 《机器学习》(Machine Learning)——Andrew Ng 斯坦福大学公开课学习笔记(一)
- 斯坦福大学iOS开发公开课总结(一) :iOS的MVC框架
- 斯坦福大学公开课:iOS 7应用开发 (一)
- jquery jstree 插件的使用
- poj 1308
- php一个题
- Android 2.2,2.3 浏览器不支持XPATH的对策
- 代码收藏
- 斯坦福大学公开课:编程范式(一)
- 设计模式——备忘录模式
- 私募细解看盘三大要点
- map遍历取值的几种方式
- 怎么样去做一个每天都精力充沛的人?
- java面向对象
- ggplot2使用感受
- 计算机的字节序“大端”和“小端”
- 万用板的焊接