在M语言中,每个运算符所带的操作数个数以及每个操作数的类型都有语法规定,是不能改变的。若在一个表达式中,运算符的某个操作数不符合语法要求,则系统要对操作数进行类型转换,M语言中类型转换有2中情况:自动类型转换盒赋值转换。
u 自动类型转换
自动类型转换(也称隐式类型转换):由系统按类型转换规则自动完成。在M语言中,如果编译器看见一个表达式或者函数使用了不合适的类型,通常会进行自动的类型转换,即自动类型转换,这是系统自动将表达式中的操作数转换成所需类型的值,例如,若定义两个变量a和d:
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