Типы char, short, int и long

char #

Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127.

uchar #

Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar предназначен только для положительных значений. Минимальное значение равно нулю, максимальное значение равно 255. Первая буква u в названии типа uchar является сокращением слова unsigned (беззнаковый).

short #

Целый тип short имеет размер 2 байта(16 бит) и, соответственно, позволяет выразить множество значений равное 2 в степени 16: 2^16=65 536. Так как тип short является знаковым и содержит как положительные, так и отрицательные значения, то диапазон значений находится между -32 768 и 32 767.

ushort #

Беззнаковым типом short является тип ushort, который также имеет размер 2 байта. Минимальное значение равно 0, максимальное значение 65 535.

int #

Целый тип int имеет размер 4 байта (32 бита). Минимальное значение -2 147 483 648, максимальное значение 2 147 483 647.

uint #

Беззнаковый целый тип uint занимает в памяти 4 байта и позволяет выражать целочисленные значения от 0 до 4 294 967 295.

long #

Целый тип long имеет размер 8 байт (64 бита). Минимальное значение -9 223 372 036 854 775 808, максимальное значение 9 223 372 036 854 775 807.

ulong #

Целый тип ulong также занимает 8 байт и позволяет хранить значения от 0 до 18 446 744 073 709 551 615.

 

Примеры:

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

Так как беззнаковые целые типы не предназначены для хранения отрицательных значений, то попытка установить отрицательное значение может привести к неожиданным последствиям. Вот такой невинный скрипт приведет к бесконечному циклу:

//--- бесконечный цикл
void OnStart()
  {
   uchar  u_ch;
 
   for(char ch=-128;ch<128;ch++)
     {
      u_ch=ch;
      Print("ch = ",ch," u_ch = ",u_ch);
     }
  }

Правильно будет так:

//--- правильный вариант
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;
     }
  }

Результат:

   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
    ... 

Примеры:

//--- отрицательные значения нельзя хранить в беззнаковых типах
uchar  u_ch=-120;
ushort u_sh=-5000;
uint   u_in=-401280;

 

Шестнадцатеричные: цифры 0-9, буквы а-f или А-F для значений 10-15; начинаются с 0х или 0Х.

Примеры:

0x0A0x120X120x2f0xA30Xa30X7C7

 

Для целочисленных переменных значения можно задавать в бинарном виде с помощью префикса B. Например, можно закодировать рабочие часы торговой сессии в переменную типа int и использовать информацию о них согласно требуемому алгоритму:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- для рабочих часов ставим 1, для нерабочих указываем 0
   int AsianSession   =B'111111111'// азиатская сессия с 0:00 часов до 9:00
   int EuropeanSession=B'111111111000000000'// европейская сессия  9:00 - 18:00
   int AmericanSession =B'111111110000000000000011'// американская 16:00 - 02:00
//--- выведем числовые значения сессий
   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);
//--- а теперь выведем строковые представления рабочих часов сессий
   Print("Asian session ",GetHoursForSession(AsianSession));
   Print("European session ",GetHoursForSession(EuropeanSession));
   Print("American session ",GetHoursForSession(AmericanSession));   
//---
  }
//+------------------------------------------------------------------+
//| возвращает рабочие часы сессии в строковом виде                  |
//+------------------------------------------------------------------+
string GetHoursForSession(int session)
  {
//--- для проверки используем битовые операции AND и сдвиг на один бит влево <<=1
//--- начинаем проверять с самого младшего бита
   int bit=1;
   string out="working hours: ";
//--- будем проверять все 24 бита, начиная с нулевого до 23 включительно   
   for(int i=0;i<24;i++)
     {
      //--- получим состояние бита bit в числе number
      bool workinghour=(session&bit)==bit;
      //--- добавим номер часа в сообщение
      if(workinghour )out=out+StringFormat("%d ",i); 
      //--- сдвигаем на один бит влево для проверки значения следующего
      bit<<=1;
     }
//--- сформированная строка
   return out;
  }

Смотри также

Приведение типов