MQL5 リファレンス言語基礎データ型整数型Char、Short、Int 及び Long 型 

Char、Short、Int 及び Long 型

char

char 型は、メモリの 1 バイト(8 ビット)を占め、2 進数で 2^8=256 個の値を表現することが出来ます。char 型は、正と負の両方の値を含むことが出来ます。値の範囲は -128 から 127 です。

uchar

uchar 整数型も char 型のようにメモリの 1 バイトを占めますが、uchar は char と違って正の値のみを含むことが出来ます。 最小値は 0 で最大値は 255 です。uchar 型の名称の最初の文字の u は unsigned の略です。

short

short 型は 2 バイト(16 ビット)で、2 から 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
   ...

例:

//--- 負の値は unsigned 型に格納出来ない
uchar  u_ch=-120;
ushort u_sh=-5000;
uint   u_in=-401280;

16 進数は、数字の 0〜9 及び 10〜15 の値を記す a〜f または A〜F の文字で表され、0x または 0X で始まります。

例:

0x0A0x120X120x2f0xA30Xa30X7C7

整数型の変数の値は、B プレフィックスを使用して2 進数で設定出来ます。例えば、取引セッションの作業時間はint 型の変数にエンコードし、必要なアルゴリズムに従って、情報を使用することが出来ます。

//+------------------------------------------------------------------+
//| スクリプトプログラムを開始する関数                                          |
//+------------------------------------------------------------------+
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 ビットで左シフトする( <<=1)
//--- 最下位ビットからチェックを開始
  int bit=1;
  string out="working hours: ";
//--- 0〜23 の 24 ビットをすべてチェックする  
  for(int i=0;i<24;i++)
    {
    //--- ビットの状態を数で受け取る
    bool workinghour=(session&bit)==bit;
    //--- 時間の数をメッセージに追加する
    if(workinghour )out=out+StringFormat("%d ",i);
    //--- 左に 1 ビットシフトし、次の値をチェックする
     bit<<=1;
    }
//--- 結果の文字列
  return out;
 }

参照

型キャスト