(5)无符号整数

  将一个unsigned 型数据赋给一个占据同样长度存储单元的整型变量时(如:unsigned→int、unsigned long→long,unsigned short→short) ,原值照赋,内部的存储方式不变,但外部值却可能改变。

  将一个非unsigned整型数据赋给长度相同的unsigned型变量时, 内部存储形式不变,但外部表示时总是无符号的。

/*例:赋值运算符举例 */
main()
{
    unsigned a,b;
    int i,j;

    a=65535;
    i=-1;
    j=a;
    b=i;

    printf("(unsigned)%u→(int)%d ",a,j);
    printf("(int)%d→(unsigned)%u ",i,b);
}

  运行结果为:

  计算机中数据用补码表示,int型量高位是符号位,为1时表示负值,为0时表示正值。如果一个无符号数的值小于32768则高位为0,赋给 int型变量后、得到正值。如果无符号数大于等于32768,则高位为1, 赋给整型变量后得到一个负整数值。反之,当一个负整数赋给unsigned 型变量时,得到的无符号值是一个大于32768的值。(这里假定int型占两个字节)

  C语言这种赋值时的类型转换形式可能会使人感到不精密和不严格,因为不管表达式的值怎样,系统都自动将其转为赋值运算符左部变量的类型。

  而转变后数据可能有所不同,在不加注意时可能带来错误。 这确实是个缺点,也遭到许多人们批评。但不应忘记的是:C面言初是为了替代汇编语言而设计的,所以类型变换比较随意。当然, 用强制类型转换是一个好习惯,这样,至少从程序上可以看出想干什么。

  3、强制类型转换

  可以利用强制类型转换运算符将一个表达式转换成所需类型:

  例如:

  (double)a       (将a转换成double类型)

  (int)(x+y)      (将x+y的值转换成整型)

  (float)(5%3)    (将5%3的值转换成float型)

  (int)(1.5+2.3) = 3

  (int)1.5+2.3=?

  对于从高到低的强制转换,实质上是一个截断的操作,只把低端需要的部分保留,其余的部分直接扔掉了。