Tipos char, short, int y long

char #

El tipo entero char ocupa en la memoria 1 byte (8 bits) y permite representar en el sistema numérico binario 2^8 valores = 256. El tipo char puede contener los valores positivos, igual que negativos. El rango de valores es de -128 a 127.

uchar #

El tipo entero uchar también ocupa en la memoria 1 byte, igual que el tipo char, pero a diferencia de él, uchar está destinado únicamente para los valores positivos. El valor mínimo es igual a cero, el valor máximo es igual a 255. La primera letra u del nombre uchar es la abreviatura de la palabra unsigned (sin signo).

short #

El tipo entero short tiene el tamaño de 2 bytes (16 bits), permite representar la multitud de valores igual a 2 elevado a 16: 2^16 = 65 536. Puesto que el tipo short es con signos y contiene los valores tanto positivos, como negativos, el rango de valores se oscila entre -32 768 y 32 767.

ushort #

El tipo ushort es el tipo short sin signos, también tiene el tamaño de 2 bytes. El valor mínimo es igual a cero, el valor máximo es igual a 65 535.

int #

El tipo entero int tiene el tamaño de 4 bytes (32 bits). El valor mínimo es de —2 147 483 648, el valor máximo es de 2 147 483 647.

uint #

El tipo entero sin signos uint ocupa en la memoria 4 bytes y permite representar los valores de números enteros de 0 a 4 294 967 295.

long #

El tipo entero long tiene el tamaño de 8 bytes (64 bits). El valor mínimo es de —9 223 372 036 854 775 808, el valor máximo es de 9 223 372 036 854 775 807.

ulong #

El tipo entero ulong también ocupa 8 bytes y permite almacenar valores de 0 a 18 446 744 073 709 551 615.

Ejemplos:

char  ch=12;
short sh=-5000;
int   in=2445777;

Debido a que los tipos enteros sin signos no sirven para almacenar los valores negativos, el intento de poner los valores negativos puede llevar a las consecuencias inesperadas. Pues un script inocente como éste llevará a un ciclo contínuo:

//--- ciclo continuo
void OnStart()
  {
   uchar  u_ch;
 
   for(char ch=-128;ch<128;ch++)
     {
      u_ch=ch;
      Print("ch = ",ch," u_ch = ",u_ch);
     }
  }

Así es correcto:

//--- versión correcta
void OnStart()
  {
   uchar  u_ch;
 
   for(char ch=-128;ch<=127;ch++)
     {
      u_ch=ch;
      Print("ch = ",ch," u_ch = ",u_ch);
      if(ch==127) break;
     }
  }

Resultado:

  ch= -128  u_ch= 128

  ch= -127  u_ch= 129

  ch= -126  u_ch= 130

  ch= -125  u_ch= 131

  ch= -124  u_ch= 132

  ch= -123  u_ch= 133

  ch= -122  u_ch= 134

  ch= -121  u_ch= 135

  ch= -120  u_ch= 136

  ch= -119  u_ch= 137

  ch= -118  u_ch= 138

  ch= -117  u_ch= 139

  ch= -116  u_ch= 140

  ch= -115  u_ch= 141

  ch= -114  u_ch= 142

  ch= -113  u_ch= 143

  ch= -112  u_ch= 144

  ch= -111  u_ch= 145

   ...

Ejemplos:

//--- no se puede guardar los valores negativos en los tipos sin signos
uchar  u_ch=-120;
ushort u_sh=-5000;
uint   u_in=-401280;

 

Hexadecimales: cífras 0-9, letras a-f o A-F para los valores 10-15, se empiezan con 0x o 0X.

Ejemplos:

0x0A0x120X120x2f0xA30Xa30X7C7

Para las variables de números enteros, los valores se puede establecer en forma binaria usando el prefijo B. Por ejemplo, se puede codificar las horas de trabajo de la sesión de trading en la variable del tipo int y usar la información sobre ellas según el algoritmo necesario:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- para las horas de trabajo ponemos 1, para las horas no laborales ponemos 0
   int AsianSession   =B'111111111'// sesión asiática desde 0:00 hasta 9:00
   int EuropeanSession=B'111111111000000000'// sesión europea  9:00 - 18:00
   int AmericanSession =B'111111110000000000000011'// sesión americana 16:00 - 02:00
//--- mostramos los valores numéricos de las sesiones
   PrintFormat("Asian session hours as value =%d",AsianSession);
   PrintFormat("European session hours as value is %d",EuropeanSession);
   PrintFormat("American session hours as value is %d",AmericanSession);
//--- ahora mostramos las representaciones de cadenas de las horas de trabajo de las sesiones
   Print("Asian session ",GetHoursForSession(AsianSession));
   Print("European session ",GetHoursForSession(EuropeanSession));
   Print("American session ",GetHoursForSession(AmericanSession));   
//---
  }
//+------------------------------------------------------------------+
//| devuelve las horas de trabajo de las sesiones en forma de cadena                  |
//+------------------------------------------------------------------+
string GetHoursForSession(int session)
  {
//--- para comprobar, utilizamos las operaciones de bit AND y desplazamiento a un bit a la izquierda <<=1
//--- empezamos a comprobar desde el menor bit
   int bit=1;
   string out="working hours: ";
//--- vamos a comprobar todos los 24 bits empezando desde 23 inclusive  
   for(int i=0;i<24;i++)
     {
      //--- obtenemos el estado del bit bit en el número number
      bool workinghour=(session&bit)==bit;
      //--- agregamos el número de la hora en el mensaje
      if(workinghour )out=out+StringFormat("%d ",i); 
      //--- desplazamos a un bit a la izquierda para comprobar el siguiente
      bit<<=1;
     }
//--- cadena formada
   return out;
  }

 
Véase también

Conversión de tipos