您的位置:首页 > 其它

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

2011-01-18 23:48 232 查看
4.1.5.3 有符号整型转换
整型类型转换中超过目标类型取值范围的问题,不仅存在在无符类型转换中,也存在有符号类型转换中,例如,当一个值由类型long或unsigned int转换为int,结果为有符号整型并溢出,这与转换为无符号整数不同,后者将会丢弃执行结果。

绝大多数编译会丢弃原来值二进制表示的高位,并将最低位解释为新类型,如下例所示,在这种策略下,一个unsigned int类型现有的位模式被解释为一个有符号int值。

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

int i = UINT_MAX; // Result: i = -1 (in two's complement

// representation)

然而,由于编译器不同,这样的一个转换有的编译器会抛出一个信号提示值溢出。当一个实数和一个复数转换为有符号整型时,与转换为无符号整型具有同样的规则,这与前面一节描述的一样。

4.1.5.4 浮点类型实数转换
不是所有的整型值可以被浮点型表示,例如,虽然float类型的取值范围包含了long和long long的取值范围,float仅精确到小数点后6位,因而,一起long类型的值不能精确地存储在float对象中,这种转换的结果是下一个或更高的二进制值,如下例所示:

long l_var = 123456789L;

float f_var = l_var; // Implicitly converts long value to float.

printf("The rounding error (f_var - l_var) is %f/n", f_var - l_var);

记住此例中的减操作,像所有浮点型一样,结果至少具有double类型的精度,此代码段输出如下:

The rounding error (f_var - l_var;) is 3.000000

任意一个浮点类型可以使用精度比它大的另一个浮点类型来表示,因此,当一个double值转换为long double,或者当一个float值转换为double或long double,值会精确地保持。当从一个高精度转换为一个低精度类型时,然而,其值可能会超出新类型的范围,如果超出,转换的结果是未定义的;如果其值在目标类型的范围内,但目标类型的精度不能精确地表示它,此时,结果为下一更小的或下一个更大的二进制值,Example 2-2中的程序描述了转换为一个低精度浮点类型时产生的误差错误。

当一个复数转换为一个实数时,虚数部分被简单地丢弃掉,结果为复数据的实数部分,它之后可能会转换为本章中描述的目标类型。

4.1.5.5 浮点型复数转换
当一个整型或浮点型实数转换为一个复数类型时,结果值的实数部分按照前面的规则转换为浮点型实数,虚数部分为0。

当一个复数转换为另一个不同的复数类型时,实数和虚数数分单独根据浮点型实数的规则进行转换。

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

// constant I

double _Complex dz = 2;

float _Complex fz = dz + I;

在两行初始化语句中,整型常量2隐式地转换为double_Complex并赋值给dz, dz的结果为2.0 + 0.0 * I 。

在fz的初始化中,dz的double_Complex值两部分都转换为float,fz的实数部分等于2.0F, 虚数部分为1.0F。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: