変数

変数名の付け方

変数名を決める際、日本語からネーミングを生成してくれるネーミング | codicを使うととても便利です。

どの記法でなければならないという決まりはないので自分の使いやすい記法で良いですが、記法は統一しましょう。

  1. PascalCaseパスカルケース
    変数名に含まれる単語の頭文字をすべて大文字にする記法です。プログラミング言語Pascalで使われていた記法であることが由来。
    例)UserId、CustomerName
  2. camelCaseキャメルケース
    先頭を除くすべての単語の頭文字を大文字にする記法です。単語の並びがラクダ(camel)のこぶのように見えることが由来。
    例)userId、customerName
  3. snake_case スネークケース
    単語間を_(アンダースコア)でつなげる記法。単語はすべて小文字。蛇のように見えることが由来。
    例)user_id、customer_name
  4. SNAKE_CASEスネークケース
    単語間を_(アンダーバー)でつなげる記法。単語はすべて大文字。
    例)USER_ID、CUSTOMER_NAME
  5. ハイフネーション
    単語間を-(ハイフン)でつなげる記法。ケバブケースとも言います。
    例)user-id、customer-name
  6. 変換なし
    入力された日本語を英語にします。変数名に半角スペースは使えないので、おそらく英単語を確認するためのもの。
    例)user id、customer name

以下は単語間の繋げ方のルールというよりは変数の意味をわかりやすくする+α的なもの。

  1. ハンガリアン(ハンガリー)
    変数名・関数名などに接頭辞・接尾辞をつけることで、使用方法・データ型をわかるようにしたもの。この記法の考案者がハンガリー出身であることに由来。

ハンガリアン記法

型を表す接頭辞

文字 意味 使用例
bまたはf 論理型
ch 文字型
by バイト型
nまたはi 整数型
l 長整数
u 符号なし整数
w ワード型
dw ダブルワード型
fpまたはf 単精度浮動小数点型
dbまたはd 倍精度浮動小数点型
pまたはlp ポインタ型
s 文字列型
sz ゼロ終端文字列型
fn 関数ポインタ型
h ハンドル型
hwndまたはh ウィンドウハンドル型
g_ グローバル変数
c_ 定数
c_ 静的変数
m_ クラスのメンバー変数
C クラス
tag 構造体タグ

2の補数

2の補数とは2進数で負の数を表すのに使われている方法です。2 の補数では先頭ビットが符号を表し、「0」の場合はプラス、「1」の場合はマイナスを表します。負の数を表す場合ビット数は固定して考えます。

2の補数(負の数)の作り方

  1. 符号を無視して2進数に変換する。
  2. 各ビットを反転させる。
  3. 最終ビットに1を加える。

「-5」を2進数で表す例。4ビット固定で。

符号を取り除いた「5」を2進数にする。

0101

各ビットを反転。(0→1、1→0)

1010

1を加えた値が2の補数になります。

1011

2の補数からの戻し方

2の補数を作るときと逆の手順を行います。

  1. 2の補数から-1する。
  2. 各ビットを反転させる。
  3. 10進数にして先頭にマイナスをつける。

「1011」を戻す例。

1を引く。

1010

各ビットを反転。(0→1、1→0)

1010

10進数にしてマイナスを付ける。

-5

Empty/Empty

空の状態を表す。変数や空の配列を宣言したときの初期値。

ダイアログボックスでキャンセルしたときにEmptyを返します。

Null/Null

2バイト整数(符号付)/SmallInt

範囲
\({-32,768}_{(10)} 〜 {32,767}_{(10)}\)
最大値
\[0111~1111~1111~1111_{(2)}={2^{15}-1}_{(10)}=32767_{(10)}\]
最小値
\[1000~0000~0000~0000_{(2)}={-2^{15}}_{(10)}=-32768_{(10)}\]

4バイト整数(符号付)/Integer

範囲
\({-2,147,483,648}_{(10)} ~ {2,147,483,647}_{(10)}\)
最大値
\[0111~1111~1111~1111~1111~1111~1111~1111 _{(2)}={2^{32}-1}_{(10)}={2147483647}_{(10)}\]
最小値
\[1000~0000~0000~0000~0000~0000~0000~0000 _{(2)}={-2^{32}}_{(10)}={-2147483648}_{(10)}\]

単精度浮動小数点数/Single

正の値
\({1.1754944 \times 10^{-38}}_{(10)}\) ~ \({3.40282339717 \times 10^{38}}_{(10)}\)
負の値
\({-3.40282339717 \times 10^{38}}_{(10)}\) ~ \({-1.1754944 \times 10^{-38}}_{(10)}\)
\[(-1)^{\mathrm{sign}} \times 2^{\mathrm{exponent} – \mathrm{exponent}\ \ \mathrm{bias}} \times 1.\mathrm{mantissa}\]
  1. \(\mathrm{sign}:符号\)
  2. \(\mathrm{exponent}:指数部\)
  3. \(\mathrm{exponent} \mathrm{bias}:指数部バイアス\)
  4. \(\mathrm{mantissa}:仮数部\)
\[(-1)^{\mathrm{s}}\times1.xxxxxxxxxxxxxxxxxxxxxxx\times{2^{yyyyyyyy}}_{(2)}\]
  1. \(s:符号部\)
  2. \(xxx:仮数部\)
  3. \(yyy:指数部\)
符号ビット
1ビット
指数部の幅
8ビット(ゲタ履き表現)
仮数部の幅
23ビット

符号ビットは表現する数値の符号(正負)を示します。指数部は8ビットで、符号なし整数として見た場合は0~255の値をとり、0のときは0か非正規化数であることを、1~254のときは-127のゲタ履き(バイアス付き)表現で-126~127の指数を、255のときは無限大またはNaNであることを示します。

指数部が0(0および非正規化数)の場合を除き、仮数部で表現されるビットパターンのさらにひとつ上の桁に暗黙の1のビットがあるとみなす表現法(ケチ表現)により、正規化された数の制度は、24ビットである。十進に換算したときに表現できる桁数は\(\log_{10} 2^{24} \approx 7.225\)桁となります。

指数部の符号化方式

単精度浮動小数点数の指数部はオフセット(ゲタ履き)表現を使って符号化されており、指数値が0のときオフセット値(バイアス値)は127である。

  1. \(E_{min}=01_{H}-7F_{H}=-126\)
  2. \(E_{max}=FE_{H}-7F_{H}=127\)
  3. \(exponent\ \ bias(指数バイアス)={7F}_{H}=127\)

\(00_{H}\)と\(FF_{H}\)は予約された指数値です。

正の最小値(単精度)

単精度浮動小数点数 正の最小値
符号
\((-1)^{0}\)
仮数部
\(xxx = 000~0000~0000~0000~0000~0000\)
\(1.xxx=1.00000000000000000000000_{(2)}={2^{0}}_{(10)}=1.0_{(10)}\)
指数部
\(yyy = 0000~0001_{(2)}=1_{(10)}\)
\({2^{1-127}}_{(10)}={2^{-126}}_{(10)}\)=\({\frac{1}{2^{126}}}_{(10)}\)=\({1.1754944\times10^{-38}}_{(10)}\)
符号×仮数部×指数部
\[ \begin{eqnarray} value_{min}&=&(-1)^{0} \times 1 \times \frac{1}{2^{126}}\\ &=&1.175494351 \times 10^{-38} \end{eqnarray} \]

正の最大値(単精度)

単精度浮動小数点数 正の最大値
符号
\((-1)^{0}\)
仮数部
\(xxx = 111~1111~1111~1111~1111~1111_{(2)}\)
\(1.xxx=1.11111111111111111111111\)
\[2^{0},2^{-1},2^{-2},…,2^{-23}\]
  1. \(初項:a=1\)
  2. \(公比:r=0.5\)
  3. \(項数:n=24\)
\(S=\frac{a(1-r^{n})}{1-r}=\frac{1-0.5^{24}}{1-0.5}=\frac{1-0.5^{24}}{0.5}={1.99999988079}_{(10)}\)
指数部
\(yyy = 1111~1110_{(2)}=254\)
\({2^{254-127}}_{(10)} = {2^{127}}_{(10)}={1.7014118\times10^{38}}_{(10)}\)
符号×仮数部×指数部
\[ \begin{eqnarray} value_{max}&=&(-1)^{0} \times \frac{1-0.5^{24}}{0.5} \times 2^{127} \\ &=&3.4028235 \times 10^{38} \end{eqnarray} \]

負の最小値(単精度)

単精度浮動小数点数 負の最小値
符号
\((-1)^{1}\)
仮数部
\(xxx = 111~1111~1111~1111~1111~1111_{(2)}\)
\(1.xxx=1.11111111111111111111111_{(2)}\)
\(S=\frac{a(a-r^{n})}{1-r}=\frac{1-0.5^{24}}{1-0.5}=\frac{1-0.5^{24}}{0.5}=1.99999988079_{(10)}\)
指数部
\(yyy = 1111~1110_{(2)}=254\)
\({2^{254-127}}_{(10)}={2^{127}}_{(10)}=1.7014118 \times {10^{38}}_{(10)}\)
符号×仮数部×指数部
\[ \begin{eqnarray} value_{min}&=&(-1)^{1} \times \frac{1-0.5^{24}}{0.5} \times 2^{127}\\ &=&-3.4028235 \times 10^{38} \end{eqnarray} \]

負の最大値(単精度)

単精度浮動小数点数 負の最大値
符号
\((-1)^{1}\)
仮数部
\(xxx = 000~0000~0000~0000~0000~0000_{(2)}\)
\(1.xxx=1.00000000000000000000000_{(2)}\)
\({2^{0}}_{(10)}=1.0_{(10)}\)
指数部
\(yyy = 0000~0001_{(2)}\)
\({2^{1-127}}_{(10)}={2^{-126}}_{(10)}\)=\({\frac{1}{2^{126}}}_{(10)}\)=\({1.1754944\times10^{-38}}_{(10)}\)
符号×仮数部×指数部
\[ \begin{eqnarray} value_{max}&=&(-1)^{1} \times 1.0 \times \frac{1}{2^{126}} \\ &=&-1.175494351 \times 10^{-38} \end{eqnarray} \]

倍精度浮動小数点値/Double

範囲(正の値)
\(4.94065645841247 \times 10^{-324} ~ 1.79769313486232 \times 10^{308}\)
範囲(負の値)
\(-1.79769313486232 \times 10^{308} ~ -4.94065645841247 \times 10^{-324}\)
\[(-1)^{\mathrm{sign}} \times 2^{\mathrm{exponent} – \mathrm{exponent}\ \ \mathrm{bias}} \times 1.\mathrm{mantissa}\]
  1. \(\mathrm{sign}:符号\)
  2. \(\mathrm{exponent}:指数部\)
  3. \(\mathrm{exponent} \mathrm{bias}:指数部バイアス\)
  4. \(\mathrm{mantissa}:仮数部\)
符号
1ビット
指数部(ゲタ履き表現)
11ビット(-1022~1023)
仮数部
52ビット

指数部の符号化方式

倍精度浮動小数点数の指数部はオフセット(ゲタ履き)表現を使って符号化されており、指数値が0のときオフセット値(バイアス値)は1023である。

  1. \(E_{min}=01_{H}-3FF_{H}=-1022\)
  2. \(E_{max}=7FE_{H}-3FF_{H}=1024\)
  3. \(exponent\ \ bias(指数バイアス)={3FF}_{H}=1023\)

\(00_{H}\)と\(FF_{H}\)は予約された指数値です。

正の最小値(倍精度)

倍精度浮動小数点数 正の最小値
符号
\((-1)^{0}=+1\)
仮数部
\(xxx=0000~0000~0000~0000~0000~0000~0000~0000~0000~0000~0000~0000~0000\)
\(1.xxx=1.0000000000000000000000000000000000000000000000000000\)
\(2^{0}\times1+2^{-1}\times0+2^{-2}\times0+2^{-3}\times0+…+2^{-52}\times0=2.0\)
指数部
\({2^{1-1023}}_{(10)}={2^{-1022}}_{(10)}=2.225074 \times 10^{-308}\)
符号×仮数部×指数部
\[ \begin{eqnarray} value_{min}&=&(-1)^{0} \times 2.0 \times 2^{-1022} \\ &=&4.450148 \times 10^{-308} \\ \end{eqnarray} \]

正の最大値(倍精度)

倍精度浮動小数点数 正の最大値
符号
\((-1)^{0}=+1\)
仮数部
\(xxx=1111~1111~1111~1111~1111~1111~1111~1111~1111~1111~1111~1111~1111\)
\(1.xxx=1.1111111111111111111111111111111111111111111111111111\)
\[2^{0} \times 1, \quad 2^{-1} \times 1, \quad 2^{-2} \times 1, \quad 2^{-3} \times 1, \quad …, \quad 2^{-52} \times 1\] \[S=\frac{a(1-r^n)}{1-r}=\frac{1 \times (1-0.5^{53})}{1-0.5}=2.0\]
指数部
\({2^{2046-1023}}_{(10)}={2^{1023}}_{(10)}=8.988466\times10^{307}\)
符号×仮数部×指数部
\[ \begin{eqnarray} value_{max}&=&(-1)^{0} \times 2.0 \times 2^{1023}\\ &=&1.7976932 \times 10^{308} \\ \end{eqnarray} \]

負の最小値(倍精度)

倍精度浮動小数点数 負の最小値
符号
\((-1)^{1}=-1\)
仮数部
\(xxx=1111~1111~1111~1111~1111~1111~1111~1111~1111~1111~1111~1111~1111\)
\(1.xxx=1.1111111111111111111111111111111111111111111111111111\)
\[2^{0} \times 1, \quad 2^{-1} \times 1, \quad 2^{-2} \times 1, \quad 2^{-3} \times 1, \quad …, \quad 2^{-52} \times 1\] \[S=\frac{a(1-r^n)}{1-r}=\frac{1 \times (1-0.5^{53})}{1-0.5}=2.0\]
指数部
\({2^{2046-1023}}_{(10)}={2^{1023}}_{(10)}=8.988466\times10^{307}\)
符号×仮数部×指数部
\[ \begin{eqnarray} value_{min}&=&(-1)^{1} \times 2.0 \times 2^{1023} \\ &=&-1.7976932 \times 10^{308} \\ \end{eqnarray} \]

負の最大値(倍精度)

倍精度浮動小数点数 負の最大値
符号
\((-1)^{1}=-1\)
仮数部
\(xxx=0000~0000~0000~0000~0000~0000~0000~0000~0000~0000~0000~0000~0000\)
\(1.xxx=1.0000000000000000000000000000000000000000000000000000\)
\(2^{0} \times 1+2^{-1} \times 0+2^{-2} \times 0+2^{-3} \times 0+…+2^{-52} \times 0=2.0\)
指数部
\({2^{1-1023}}_{(10)}={2^{-1022}}_{(10)}=2.225074 \times 10^{-308}\)
符号×仮数部×指数部
\[ \begin{eqnarray} value_{max}&=&(-1)^{1} \times 2.0 \times 2^{-1022} \\ &=&-4.450148 \times 10^{-308} \\ \end{eqnarray} \]

通貨型/Currency

正の最小値

正の最大値

符号
\((-1)^{0}=1\)
整数部
\(2^{63}-1=9,223,372,036,854,775,807\)
実際使うときは1/10000倍する。
\(922,337,203,685,477.5807\)

負の最小値

符号
\((-1)^{1}=1\)
整数部
\(-2^{63}=-9,223,372,036,854,775,808\)
実際使うときは1/10000倍する。
\(-922,337,203,685,477.5808\)

負の最大値

通貨型変数(Currency)は整数部15桁、小数部4桁の固定小数点型変数です。内部的には10000倍されて19桁の整数として記憶されます。

-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807

日付型/Date

範囲
-657,434 ~ 2,958,465(100/01/01 ~ 9999/12/31)
PRINT VARTYPE(-657434, VAR_DATE)	// 100/01/01
PRINT VARTYPE(2958465, VAR_DATE)	// 9999/12/31

オブジェクト/Dispatch

CREATEOLEOBJ関数で作成したオブジェクトの値が入ります。生成するたびに値は変わります。

エラー値/Error

ブール型/Boolean

TRUEまたはFALSEを格納するための型。0以外の値はTrue、0はFalseとなります。

バリアント/Variant

未定義のオブジェクト/Unknown

1バイト整数(符号付き)/SByte

\(2^{7}-1=127\)
\(-2^{8}=-128\)

1バイト整数(符号なし)/Byte

\(2^{8}-1=255\)
0

2バイト整数(符号なし)/Word

\(2^{16}-1=65535\)
0

4バイト整数(符号なし)/DWord

\(2^{32}=4,294,967,295\)
0

8バイト整数(符号付き)/Int64

\((-1)^{0} \times 2^{63}-1=9,223,372,036,854,775,807 \)
\((-1)^{1} \times 2^{63}=-9,223,372,036,854,775,808\)

ANSI文字列/AStr

UNICODE文字列/UStr

配列/Array

データ型 範囲
Empty/Empty
Null/Null
2バイト整数(符号付)/SmallInt -32,768~32,767
4バイト整数(符号付)/Integer -2,147,483,648 ~ 2,147,483,647
単精度浮動小数点値/Single -3.402823E+38 ~ -1.401298E-45(負の値)
1.401298E-45 ~ 3.402823E+38(正の値)
倍精度浮動小数点値/Double -1.79769313486232E+308 ~ -4.94065645841247E-324(負の値)
4.94065645841247E-324 ~ 1.79769313486232E+308(正の値)
通貨型/Currency -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807
日付型/Date -657,434 ~ 2,958,465(100/01/01 ~ 9999/12/31)
オブジェクト/Dispatch
エラー値/Error
ブール型/Boolean
バリアント/Variant
未定義のオブジェクト/Unknown
1バイト整数(符号付き)/SByte -128 ~ 127
1バイト整数(符号なし)/Byte 0 ~ 255
2バイト整数(符号なし)/Word 0 ~ 65,535
4バイト整数(符号なし)/DWord 0 ~ 4,294,967,295
8バイト整数(符号付き)/Int64 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
ANSI文字列/AStr
UNICODE文字列/UStr
配列/Array

INFはINFinityインフィニティの略で無限大を表し、オーバーフローか発生したときに表示されます。

DIM n                   // Double型
n = POWER(2, 1024)      // 2^1024
PRINT n
IF n = “INF” THEN PRINT TRUE
結果
INF
True

負の値でも同様です。

DIM n                     // Double型
n = -1 * POWER(2, 1024)   // -2^1024
PRINT n
IF n = “-INF” THEN PRINT TRUE
結果
-INF
True

倍精度浮動小数点数で格納できる最大値。

DIM n
n = POWER(2, 1023) * 1.9999999999
PRINT n
結果
1.79769313477243E308

型変換時にオーバーフローする例。

DIM n      // 倍精度浮動小数点数で宣言
n = 32768
n = VARTYPE(n, VAR_SMALLINT)   // 2バイト整数(符号付)に型変換

“Double型をSmallInt型に変換する際にオーバーフローしました”というようなメッセージが出ます。「2バイト整数」では格納できる最大値が32,767なのでそれ以上の値が入っている状態で型変換するとオーバーフローします。

KansuCall:Overflow while converting variant of type (Double) into type (SmallInt)

型比較表

「左列=上段」を実行したときの結果。

1 0 -1 “1” “0” “-1” TRUE FALSE EMPTY NULL “”
1 True False False True False False True False False False False
0 False True False False True False False True False False False
-1 False False True False False True False False False False False
“1” True False False True False False False False False False False
“0” False True False False True False False False False False False
“-1” False False True False False True False False False False False
TRUE True False False False False False True False False False False
FALSE False True False False False False False True False False False
EMPTY False False False False False False False False True False False
NULL False False False False False False False False False True False
“” False False False False False False False False False False True

型変換表

上段の型を左列の型に変換します。交差したマスが変換した結果です。

Empty Null SmallInt Integer Single Double Date Dispatch Error Boolean Variant Byte Word Dword Int64 Astr Ustr Array
入力値 12.3456 12.3456 12.3456 12.3456 12.3456 CREATEOLEOBJ(“InternetExplorer.Application”) True 12.3456 12.3456 12.3456 12.3456 12.3456 12.3456
初期変換 12 12 12.3456001281738 12.3456 1900/01/11 8:17:40 True 12 12 12 12 12.3456 12.3456
Empty(0) -999999
Null(1)
SmallInt(2) 0 -999999 12 12 12 12 12 -999999 1 12 12 12 12 12 12
Integer(3) 0 -999999 12 12 12 12 12 -999999 1 12 12 12 12 12 12
Single(4) 0 -999999 12 12 12.3456001281738 12.3456001281738 12.3456001281738 -999999 1 12 12 12 12 12.3456001281738 12.3456001281738
Double(5) 0 -999999 12 12 12.3456001281738 12.3456 12.3456 -999999 1 12 12 12 12 12.3456 12.3456
Currency(6) 0 -999999 12 12 12.3456 12.3456 12.3456 -999999 1 12 12 12 12 12.3456 12.3456
Date(7) 0:00:00 -999999 1900/01/11 1900/01/11 1900/01/11 8:17:40 1900/01/11 8:17:40 1900/01/11 8:17:40 -999999 1989/12/31 1900/01/11 1900/01/11 1900/01/11 1900/01/11 1900/01/11 8:17:40 1900/01/11 8:17:40
Dispatch(9) -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999
Error(10) -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999
Boolean(11) False -999999 True True True True True -999999 True True True True True True True
Variant(12) -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999
Unknown(13) -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999
SByte(16) 0 -999999 12 12 12 12 12 -999999 1 12 12 12 12 12 12
Byte(17) 0 -999999 12 12 12 12 12 -999999 1 12 12 12 12 12 12
Word(18) 0 -999999 12 12 12 12 12 -999999 1 12 12 12 12 12 12
Dword(19) 0 -999999 12 12 12 12 12 -999999 1 12 12 12 12 12 12
Int64(20) 0 -999999 12 12 12 12 12 -999999 1 12 12 12 12 12 12
Astr(256) -999999 12 12 12.3456001281738 12.3456 1900/01/11 8:17:40 Internet Explorer True 12 12 12 12 12.3456 12.3456
Ustr(258) -999999 12 12 12.3456001281738 12.3456 1900/01/11 8:17:40 Internet Explorer True 12 12 12 12 12.3456 12.3456
Array(8192) -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999 -999999

「12.3456」をSingle型に変換したときに「12.3456001281738」になるまでの過程。

12.3456を2進数にする。

\[ 1100.010110000111100100111 \]

\(1.xxx\)表記になるよう小数点を3桁ずらす。ずらした桁数分2の乗数を掛ける。今回は3桁ずらしたから\(2^{3}\)。

\[ 1.10001 01100 00111 10010 0111 \times 2^{3} \]

小数点以下24bit目が0なら切り捨て、1なら切り上げ。これが型変換で値の変わる原因。

\[ 1.10001 01100 00111 10010 011 1 * 2^{3} \] \[ 1.10001 01100 00111 10010 100 * 2^{3} \]

指数部は下駄履き表現なので127(Single型の場合)を足す

\[3 + 127 = 130_{(10)} → 10000010_{(2)}\] \[ (-1)^{0} * 1.10001 01100 00111 10010 100 \times 2^{10000010} \] \[ 1.5432000160217285 \times 2^{(130-127)} 1.5432000160217285 \times 2^{3} =12.345600128173828 \]