诚信为本
量力而为
当前位置:ea编程网 EA知识 正文

深入理解MQL4编程语言的类型转换

在编程语言中,类型转换是一个重要的概念。在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,则可能会丢失精度。

未经允许不得转载:ea编程网 » 深入理解MQL4编程语言的类型转换