现在的位置: 首页 > 综合 > 正文

C核心技术手册(二十七)

2017年09月05日 ⁄ 综合 ⁄ 共 2033字 ⁄ 字号 评论关闭

4.1.5 算术类型转换结果

  由于不同的类型有不同的目的、特性和局限性,将一个类型转换为另一类型通常要处理这些差异,通常,一个类型转换后的值取决于目标类型的特性。

4.1.5.1 _Bool类型转换

  任何标量类型可被转换为_Bool, 结果为0i.e. 当标量值为o时,使用false; 当标量值为1时或非0时,使用true; 因为一个null指针比喻为0,所以转换为_Bool后,其值为false.

4.1.5.2 无符号整型转换

  当整型值在新的无符号类型范围内时,它的值会被保护,换句话说,如果它们在0Utype_Max之前,Utype_MAX为无符号类型的最大取值。

  在无符号类型取值范围之外的值,它们的值将会多次加上或减去Utype_MAX + 1,直到其值在新类型的取值范围之内,下面的例子描述了把一个负数赋值给无符号整型:

    #include <limits.h>       // Defines the macros USHRT_MAX, UINT_MAX, etc.

    unsigned short  n = 1000; // The value 1000 is within the range of unsigned

                              // short;

    n = -1;                   // the value -1 must be converted.

将有符号数-1赋值给一个无符号类型的变量,程序隐式地加上了USHRT_MAX + 1直到其结果在新类型的取值范围内,因为-1 + USHRT_MAX + 1 = USHRT_MAX, 上例中,n的最终结果为USHRT_MAX;

对正整数而言,会减去(Utype_MAX + 1)使其值在新类型的取值范围之内,这与除以(Utype_MAX + 1)效果相同,如下例所描述:

    #include <limits.h>       // Defines the macros USHRT_MAX, UINT_MAX, etc.

    unsigned short  n = 0;

    n = 0xFEDCBA;             // The value is beyond the range of unsigned

                              // short.

如果unsigned short16位的宽度,那么它的最大值为USHRT_MAX,其十六进制为FFFF,当值FEDCBA被转换为unsigned short时,如果与它除以十六进制10000(USHRT_MAX + 1)的余数相等,通常小于或等于FFFF,在此例中,n的值最终被赋于DCBA

 

将一个浮点型实数转换为无符号或有符号整数类型,编译器将丢弃分数部分,如果整数部分的值在新类型的取值范围外,结果将会转换为无符号类型,例如:

    double x = 2.9;

 

    unsigned long n = x;             // The fractional part of x is simply lost.

 

    unsigned long m = round(x);      // If x is non-negative, this has the

                                     // same effect as m = x + 0.5;

本例中初始化变量n时,x的值由double转换为unsigned long,并丢弃分数部分0.9.整数部分的 2将被赋值给n, 在初始化m时,使用C99标准中的round()函数,计算与x最接近的整型值,并返回一个double类型的值,小数部分的0.3在赋值给unsigned long类型的m时会被丢弃。

 

当一个复数转换为无符整数类型时,虚数部分首先会被丢弃,转换后的结果值为浮点型,例如:

    #include <limits.h>         // Defines macros such as UINT_MAX.

    #include <complex.h>        // Defines macros such as the imaginary

                                // constant I.

 

    unsigned int  n = 0;

    float _Complex  z = -1.7 + 2.0 * I;

 

    n = z;                      // In this case, the effect is the same as

                                // n = -1;

                                // The resulting value of n is UINT_MAX.

 

变量z的虚数部分被丢弃,留下实数部分的浮点值-1.7, 然后浮点型的小数部分也被丢弃,留下的整型值为-1,它通过加上UINT_MAXT + 1 转换为unsigned int类型,因此,最后n被赋值为UINT_MAX

抱歉!评论已关闭.