列挙体にはメンバを何個列挙できるか

列挙体はいくつまで列挙できるか

列挙体のメンバ数の最大って、いくつなのだろうか。

ちょっと調べてみた。

Integer型の最大値

Integer型の最大値は32767。へえ。意外と小さいな。

標準モジュールの宣言セクションに次のように書いてみる。

Public Enum MaxSize
  maxElement = 32767
End Enum

んで、イミディエイトに

Debug.Print maxsize.maxElement

と打ち込んで[Enter]。

f:id:akashi_keirin:20180422072316j:plain

とりあえずクリア。

少なくとも3万2千768+1個までは列挙できるみたい。

Integer型の限界を超える

次に、Integer型の限界を超えられるかどうかテスト。

Public Enum MaxSize
  maxElement = 32767
  nextElement
End Enum

32767の次はあるのか。イミディエイトに次のように打ち込む。

Debug.Print maxsize.nextElement

んで、[Enter]。

f:id:akashi_keirin:20180422072324j:plain

フツーに「32768」が返った。

Long型の最大値

次はLong型でやってみる。

Public Enum MaxSize
  maxElement = 32767
  nextElement
  realMaxElement = 2147483647
End Enum

イミディエイトには次のように打ち込む。

Debug.Print maxsize.realMaxElement

んで、[Enter]!

f:id:akashi_keirin:20180422072332j:plain

ふええ! 「2147483647」が返ったよ……。

ということは、21億個以上列挙できるのか!

次はどうなるんだろう。

Long型の限界を超える

お次は、

Public Enum MaxSize
  maxElement = 32767
  nextElement
  realMaxElement = 2147483647
  nextRealMaxElement
End Enum

これまで同様、イミディエイトに

Debug.Print maxsize.nextRealMaxElement

と打ち込んで[Enter]。

f:id:akashi_keirin:20180422072338j:plain

ファッ!?

ま、ー2147483648???

ループして負の数の最小値に飛んで行ったのか!

……ということは……、

「21億個以上」どころか、43億個近く列挙できる

ということじゃないか!

えらいこっちゃなあ……。

ちなみに、

Public Enum MaxSize
  maxElement = 32767
  nextElement
  realMaxElement = 2147483647
  nextRealMaxElement
  nextNextRealMaxElement
End Enum

こうしておいて、イミディエイトに

Debug.Print maxsize.nextNextRealMaxElement

と打ち込んで[Enter]すると、

f:id:akashi_keirin:20180422072346j:plain

やっぱり、正の数の最大値まで行くと、負の数の最小値にループしてインクリメントしていく模様。

Long型の限界を超えるとどうなるか

そこで、

Public Enum MaxSize
  maxElement = 32767
  nextElement
  realMaxElement = 2147483647
  nextRealMaxElement
  nextNextRealMaxElement
  overFlowElement = 2147483648#
End Enum

としてみる。

「2147483648」と打ち込んで[Enter]を押したら、勝手に右端に「#」がついた。

イミディエイトに

Debug.Print maxsize.overFlowElement

と打ち込んで[Enter]。すると、

f:id:akashi_keirin:20180422072356j:plain

エラーになった。

おわりに

というわけで、列挙体のメンバ数の最大値は、(たぶん)

4294967296個

です。

@akashi_keirin on Twitter