8.1.2.3 类型转换

    M语言中,每个运算符所带的操作数个数以及每个操作数的类型都有语法规定,是不能改变的。若在一个表达式中,运算符的某个操作数不符合语法要求,则系统要对操作数进行类型转换,M语言中类型转换有2中情况:自动类型转换盒赋值转换。

u  自动类型转换

    自动类型转换(也称隐式类型转换):由系统按类型转换规则自动完成。在M语言中,如果编译器看见一个表达式或者函数使用了不合适的类型,通常会进行自动的类型转换,即自动类型转换,这是系统自动将表达式中的操作数转换成所需类型的值,例如,若定义两个变量ad

int  a;

float  d;

a = 100;

b = 32.2;

则计算以下表达式:

   a / d

处理工程中:将a的值转换成float型,然后进行浮点数的除操作,结果为12.763975

要注意的是,先将a的值取出转换成double型,存储在某个临时存储单元中,然后利用该值和d相除,a存储单元中的值及类型是不会改变的。

由以上例子可以看出,一个表达式中不同数据类型的数据进行混合运算时,M语言将两个不同类型的操作数自动转换成同一类型的操作数,然后再进行运算,这就是所谓的自动类型转换。各种基本数据之间的自动类型转换规则如图2.1所示。

转换规则是将低精度类型的数据转换为高精度类型的数据,因此在数据类型转换过程中,数据的精度不会损失。

在处理表达式的过程中,并不是将低优先级的变量直接转换成高优先级的变量,而且在表达式处理的工程中,按照需要进行变换,即只有在需要时才进行转换。例如:

int ival;

ival = 3.14;

ival的值将自动被转换为3

double  val;

val = 3.14159;

进行val + ival运算后ival就会自动被转换为double型的。

2.1 不同数据类型的自动转换规则

u  赋值转换

赋值表达式中,当赋值运算符左边要赋值的变量和右边的表达式的类型不同,将进行类型转换,M语言先计算出右边表达式的值,然后将其转换为左边要赋值变量的类型后赋值给左边变量。转换规则为:

1)将精度低的变量赋值给经典高的变量时,数值保持不变。

2)将精度高的变量赋值给精度低的变量时,可能出现部分数值丢失。

例如:

int a;

a = 100;

double b;

b = a;   //b的值为100

b = 18.9;

a = b;    //a为整型,所以小数点后数值丢掉,a的值变为18