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 で始まります。
例:
0x0A、0x12、0X12、0x2f、0xA3、0Xa3、0X7C7
|
整数型の変数の値は、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;
}
|
参照
型キャスト