[VB.NET] Boolean の整数化

2010年5月8日

Boolean の整数化ですが、使う関数によって結果が異なります。要注意。

コード

Imports System.Console

Module Module1
    Sub Main()

        Dim a As Boolean = True

        WriteLine(CInt(a))
        WriteLine(System.Convert.ToInt32(a))

    End Sub
End Module

結果

-1
1

C系は 1 、BASICは -1 というのが歴史だからか…
ともかく「BASICなんだから -1」と信じていると足をすくわれそうです。






カテゴリー: Program, VB.NET

Follow comments via the RSS Feed | Leave a comment | Trackback URL

1 Comment to "[VB.NET] Boolean の整数化"

  1. 匿名

    boolean型のキャストにCIntを使うのは間違いかと。
    ToInt32は、boolean型でのtrueの定義順を返しているわけで、大抵の言語は[1]基準ではなく[0(ゼロ)]基準なので、falseは0番目に定義しているから[0],trueは1番目に定義(1基準なら2番目に定義)しているから[1]が返されるのかと。
    例えば仮に拡張ブーリアン型として[ ExtBoolean = ( ExtFalse, ExtMiddle, ExtTrue
    )]が存在するとして、ToInt32が対応していれば、ExtTrueは0基準で2番目なので[ 2
    ]が返される事に成るかと。
    対してCIntは変数のメモリ領域に格納されている16進値を抽出して、整数に無理やり変換しているだけですね。
    いずれにしろboolean型の型変換に非対応なCIntを使うのが変なわけで、これで、コンパイルが通るVBの仕様が変。本来、エラーとしてハネるべきだろうに。
    別な説明をすると、他の言語ですと列挙型というのが有り、先の拡張型ブーリアンを定義できます。VB風に記載するとこんな感じかな。

    Type ExtBoolean = ( ExtFalse, ExtMiddle, ExtTrue)
    Dim ebFlag As ExtBoolean

    ebFlag = ExtTrue

    WriteLine( ToInt32 ( ebFlag ) ) とすれば[ 2 ]が表示される。

    論理型は定義済み列挙型と見れば良いのかと。

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org