在编程语言中,类型转换是一个重要的概念。在MQL4编程语言中,经常需要将一个数值类型转换为另一个数值类型。但是,并非所有数值类型都可以互相转换。这篇文章将详细介绍MQL4的类型转换规则和示例。
1. 数值类型转换
MQL4中的数值类型转换遵循一定的规则。实线箭头表示可以进行的转换,这些转换基本上不会丢失信息。例如,char 类型可以转换为 bool 类型(都占用1字节内存),int 类型可以转换为 color 类型(占用4字节),long 类型可以转换为 datetime 类型(占用8字节)。
虚线箭头表示可能会丢失精度的转换。例如,一个整数123456789 (int) 的位数比可以由 float 表示的位数要多。
int n=123456789;
float f=n; // f 的值等于 1.234567892E8
Print("n = ",n," f = ",f);
// 输出结果 n= 123456789 f= 123456792.00000
在上述示例中,将整数转换为浮点数后,数值的顺序保持不变,但精度降低了。如果你需要将浮点数四舍五入到最接近的整数(在许多情况下这可能更有用),那么应该使用 MathRound() 函数。
//--- 重力加速度
double g=9.8;
double round_g=(int)g;
double math_round_g=MathRound(g);
Print("round_g = ",round_g);
Print("math_round_g = ",math_round_g);
/*
输出结果:
round_g = 9
math_round_g = 10
*/
2. 数值类型转换的优先级
当两个值通过二进制运算符组合时,操作执行前,较低类型的操作数会根据下面给出的优先级方案转换为较高类型。
char c1=3;
//--- 第一个示例
double d2=c1/2+0.3;
Print("c1/2 + 0.3 = ",d2);
// 输出结果: c1/2+0.3 = 1.3
//--- 第二个示例
d2=c1/2.0+0.3;
Print("c1/2.0 + 0.3 = ",d2);
// 输出结果: c1/2.0+0.3 = 1.8
在上述示例中,第一个表达式由两个操作组成。在第一个示例的第一个操作中,char 类型的变量 c1 被转换为 int 类型的临时变量,因为除法操作中的第二个操作数,常数 2,是较高类型的 int。整数除法 3/2 的结果是 int 类型的值 1。
在第一个示例的第二个操作中,第二个操作数是 double 类型的常数 0.3,所以第一个操作的结果被转换为值为 1.0 的 double 类型的临时变量。
在第二个示例中,char 类型的变量 c1 被转换为 double 类型的临时变量,因为除法操作中的第二个操作数,常数 2.0,是 double 类型的;没有进行进一步的转换。
3. 显示和隐式类型转换
在 MQL4 语言的表达式中,可以使用显式和隐式类型转换。显式类型转换写作:
var_1 = (type)var_2;
其中 var_2 可以是表达式或函数执行结果。也可以使用函数样式表示显式类型转换:
var_1 = type(var_2);
让我们通过一个示例来理解显式类型转换。
//--- 第三个示例
double d2=(double)c1/2+0.3;
Print("(double)c1/2 + 0.3 = ",d2);
// 输出结果: (double)c1/2+0.3 = 1.80000000
在上述示例中,在执行除法操作之前,变量 c1 显式地被转换为 double 类型。现在,整数常数 2 被转换为 double 类型的值 2.0,因为第一个操作数转换后的结果是 double 类型。实际上,显式类型转换是一种一元操作。
4. 类型转换的范围限制
当尝试进行类型转换时,结果可能超出允许的范围。在这种情况下,会发生截断。例如:
char c;
uchar u;
c=400;
u=400;
Print("c = ",c); // 输出结果 c=-112
Print("u = ",u); // 输出结果 u=144
在执行操作(除赋值操作外)之前,数据被转换为最高优先级的类型。在执行赋值操作之前,数据被转换为目标类型。
int i=1/2; // 没有类型转换, 结果是 0
Print("i = 1/2 ",i);
int k=1/2.0; // 表达式被转换为 double 类型,
Print("k = 1/2 ",k); // 然后被转换为目标类型 int, 结果是 0
double d=1.0/2.0; // 没有类型转换, 结果是 0.5
Print("d = 1/2.0; ",d);
double e=1/2.0; // 表达式被转换为 double 类型,
Print("e = 1/2.0; ",e);// 这与目标类型相同, 结果是 0.5
double x=1/2; // int 类型的表达式被转换为 double 目标类型,
Print("x = 1/2; ",x); // 结果是 0.0
当将 long/ulong 类型转换为 double 类型时,如果整数值大于9223372036854774784或小于-9223372036854774784,则可能会丢失精度。