斯坦福大学公开课:编程范式(一)

来源:互联网 发布:蟑螂药哪种最好用 知乎 编辑:程序博客网 时间: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。此处就属于强制转换的范畴了。

 

  

原创粉丝点击