第2講 変数を理解しよう!

第6話 バイト型とブール型
今まで文字型、整数型、単精度浮動小数点型、長整数型、倍精度浮動小数点型を見てきました。
データ量が違いますので、当然必要メモリが違います。
それぞれString型2バイト、Integer型2バイト、Single型4バイト、Long型4バイト、Double型8バイトです。
また、VBAでは変数の宣言をしないで変数を使うことが出来ますが、
宣言をしないと自動的にバリアント(Variant)型となります。バリアント型は、扱えるデータ範囲は倍精度浮動小数点型と同じですが、
メモリは倍の16バイトになってしまいます。

現在作っている程度のプログラムであれば、16バイトも食うバリアント型でも問題ありませんが、
この講義でも、後に数独問題作成ソフトや魔方陣作成ソフトなどの計算量の膨大なプログラムを扱います。
計算速度に決定的な影響を与えるのが、必要メモリです。
この話の前半で扱うバイト型は必要メモリは1バイトです。
バイト型は
Dim a As Byte
と宣言して使いますが、もしこれを省略して変数aを使うと自動的に16バイトも食うバリアント型になってしまいます。
もちろん、計算時間はメモリに単純比例するではありませんので、
Dim a As Byte
と宣言して使った方が16倍も速くなるわけではありませんが、かなりの差が生じます。
プログラムコードは学習が進んだ段階で説明しますが、
次のコードで実験すると
Private Sub CommandButton1_Click()
  Dim n As Byte
  Dim a1 As Byte, a2 As Byte, a3 As Byte, a4 As Byte, a As Byte
  Dim t1 As Double, t2 As Double
  n = 250

  t1 = Timer
  a = 0
  For a1 = 0 To n
    For a2 = 0 To n
      For a3 = 0 To n
        For a4 = 0 To n
          a = (a + 1) Mod n
        Next
      Next
    Next
  Next
  t2 = Timer
  Cells(6, 2) = t2 - t1

  t1 = Timer
  b = 0
  For b1 = 0 To n
    For b2 = 0 To n
      For b3 = 0 To n
        For b4 = 0 To n
          b = (b + 1) Mod n
        Next
      Next
    Next
  Next
  t2 = Timer
  Cells(7, 2) = t2 - t1

End Sub

Private Sub CommandButton2_Click()

  Columns("B:O").Select
  Selection.ClearContents
  Cells(1, 1).Select

End Sub
実験結果例
b1
バイト型の方が約2.5倍速いわけです。かなりの差を生んでいることがわかります。
プログラムの内容によって、速度比は変わってきます。
私の記憶では、数独問題作成ソフトVer7の場合は、軽く4倍以上違いました。
ですから、プログラムの内容によっては5,6倍違うケースもあるでしょう。


バイト型は、範囲は0〜255です。
ですから、データが255以下の整数であるとわかっている場合は、バイト型を使用すべきなのです。

値を真(True)と偽(False)しか持たないブール型というものあります。
しかし、バイト数はByte型の2倍の2バイトです。
バイト型変数で1を真、0を偽とすれば、ブール型の代わりに出来ます。
何を真とするかは、プログラマーに任されています。
ですから、私のお薦めはByte型をブール型の代わりに使うことです。
どのように使うかの具体例は、If文の学習のときに示します。


まとめとして、その他の変数型も含めて表に示しましょう。

データ型 容量 扱える範囲
バイト型(Byte) 1バイト 0〜255
ブール型(Boolean) 2バイト TeueとFalse
整数型(Integer) 2バイト -32,768 〜 32,767
長整数型(Long) 4バイト -2,147,483,648〜2,147,483,647
単精度浮動小数点型(Single) 4バイト ±1.401298E-45〜3.402823E38
倍精度浮動小数点(Double) 8バイト ±4.94065645841247E-324〜1.79769313486232E308
通貨型 (Currency) 8バイト -922,337,203,685,477.5808 〜 922,337,203,685,477.5807
日付型 (Date) 8バイト 西暦100年1月1日0:00:00 〜西暦9999年12月31日23:59:59?




第5話へ 第7話へ

004


vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る