何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 37042
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

真偽値としての true と false は、false が「0」とされている。そして、true は「false 以外」とされている。つまり、数値に変換するとき、false は必ず 0 だが、true は 0 以外のなんだってかまわない、ということ。

MSDN ライブラリで、Windows API の説明を見ると、「成功すると 0、失敗すると 0 以外を返します」と書いてあるものがある。ERROR_SUCCESS というマクロが、「‘エラー・成功’って、どういう意味よ?」はともかく、0L と設定されているからだ。LONG 型を返すものは、たいていこれ。戻り値がそのままエラーコードになる。

BOOL 型の場合、TRUE は 1 と定義されている。FALSE は 0。戻り値が BOOL の場合、GetLastError() 関数を使え、ということになっている。

そして、私の中で、真は -1 。

これは、昔の Microsoft BASIC の影響。Visual は付かない。N60 が付く(笑)

なぜ -1 なのか。符号付きだから。

2進数で考えたとき、偽は 0 なので、真は 1 しかない。どのビットで検査されても「偽ではない」を返そうとすると、すべてのビットが1で埋まる。これを符号付き10進数で表すと、-1 になる。

投稿日時 : 2007年10月17日 20:42
コメント
  • # re: 真 と 偽
    やまだ
    Posted @ 2007/10/18 2:00
    なつかしー。N88 でもそうだったと思います。

    -1 にすると、ビットで考えても
    真 or 偽 = 真
    真 and 偽 = 偽
    になるんですよねー。

    C の場合 0 は偽でそれ以外は真、それはその通りでしたけど、Java や C# とかでもそうなんでしたっけ?
    #どれがどの言語の話だかわからなくなってきてる……。
  • # re: 真 と 偽
    Hirotow
    Posted @ 2007/10/18 8:56
    VBAもTrueは-1みたいです
    ちなみにJavaやC#は数値に対応してません。
    便宜上3項演算子で数値に変換することはあるけど。
  • # re: 真 と 偽
    じゃんぬねっと
    Posted @ 2007/10/18 9:35
    補数で FFFF・・・ だからですな。
    @IT 会議室の某スレッドを思い出しますな。

    以外なのだから if では false 側の条件をまず引き合いに出した方がいいですね。
  • # re: 真 と 偽
    とっちゃん
    Posted @ 2007/10/18 11:05
    OLE-Automation(IDispatch ひいては、VARIANT)の世界も BOOL は 0 or -1 ですね。

    VARIANT はVB(4~6)までの変数型でもあるので、おそらくVB(6まで)は、真 = -1 だと思いますよ。

    なので、COM を C++(C でもいいがw)で作ってる場合、BOOL の比較は、必ず != FALSE で行う必要があります。

    たまに、== TRUE とか != TRUE なんてバグ見つけることが...orz

  • # re: 真 と 偽
    Jitta
    Posted @ 2007/10/19 22:03
    やまださん、Hirotowさん、じゃんぬねっとさん、とっちゃんさん、コメントありがとうございます。

    携帯から書き込んだつもりが、書き込めてない。。。

    > Java や C# とかでもそうなんでしたっけ?
    しまった。。。

    > 必ず != FALSE で行う必要があります。
    と併せて、調べて強調しておくべきポイントでした。
    Hirotowさん、フォローありがとうございます。
    VB.NET で、False を Integer に暗黙変換かけた場合は、0 になったと思います。True は、やってないです。
    反対に、Integer から Boolean は、0 を False、0 以外なら True にしてくれていたと思います。
    検証しとこ...
タイトル
名前
Url
コメント