C语言----数据类型与表达式(进阶篇十六)

    。。。

  无符号整数的范围

    unsigned short的取值范围为0~65535。

    unsigned short占有2个字节,也就是16位,在计算机内部用(0000 0000 0000 0000)2表示0,用(1111 1111 1111 1111)2表示最大数。

    (1)2表示1,(11)2表示3,(111)2表示7……(1111 1111 1111 1111)2表示65535,刚好是21-1、22-1、23-1……216-1,得出无符号整型的计算公式为0~2n-1(n为整型位数)。

 

  补码

    补码中第一位表示正负数:0表示正数,1表示负数。  

    补码原理

 C语言----数据类型与表达式(进阶篇十六)

    要求一个负数的补码,将它的绝对值二进制按位取反再加1,正数的补码是自己

    如求4位二进制数-3的补码:把(3)10=(0011)2按位取反得(1100)2,再加1得(1101)2,short型只是把4位扩展为16位(0000 0000 0000 0011)2,按位取反得(1111 1111 1111 1100)2,加1得(1111 1111 1111 1101)2

    16位二进制数-32768的补码:将32768转成二进制得(1000 0000 0000 0000)2,取反得(0111 1111 1111 1111)2,加1得 (1000 0000 0000 0000)2

    补码的特点是可以把减法运算转换成加法,比如一个4位二进制减法(0011)2-(0001)2在CPU中会先取得(0001)2的补码(1111)2,将此变成加法运算 (0011)2+(1111)2得到(10010)2,因为运算器只有4个位,前面的1舍去,得到正确结果(0010)2,这样CPU中就可以省去一个做减法运算的元件。

  

  不同类型的混合运算

    ※赋值语句中,等号两边类型不同时,以左边类型为准。

    如:

      int a=300;

      char b;

      b=a; /*不可预期的错误,但系统不会报错*/

    ※除法运算时,2/3的结果为0,2.0/3或者2/3.0结果都为0.66666……。这说明如果除号两边都是整数,结果只能是整数,除号两边有任意一个浮点数,结果就是精确的浮点数。

      混合运算时也遵循上述规律:

        double d=1.0+2/3;

      会先算2/3,这时答案已经是0,再加1.0,得到错误的结果1.0,改成

        double d=1.0+2/3.0;

      结果为1.666666,正确。

    ※char参与任何运算都会转换成ASCII码

    ※%(取余)不能用在浮点数上,它不会自动将浮点数转换成整数。

 

  强制转换

    格式:

      (类型名)表达式

    如:

      double d=(double)2/3+1.0;

      相当于double d=2.0/3+1.0;

      与double d=2/3.0+1.0;运算结果相同

 

上一篇:1111


下一篇:2.C语言 原码/反码/补码