12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ZOZOテクノロジーズ #3Advent Calendar 2019

Day 6

なぜVBScriptのTrueは-1なのか

Last updated at Posted at 2019-12-05

以下のドキュメントによると、VBScriptのTrueは -1 と等価です。

True キーワード

また、Falseは 0 と等価です。

False キーワード

一方、C言語ではstdbool.hの中で、trueを1と等価に、falseを0と等価にしています。

#ifndef __cplusplus

#define bool    _Bool
#define true    1
#define false   0

#else /* __cplusplus */

また、JavaScriptではtrueを整数型にキャストすると、1になります。

Number(true)
// => 1

さらに、Pythonではbool型はint型のサブタイプであり、Trueは1と等価です。

True == 1
# => True

なぜ、C言語やJavaScriptやPythonのtrueは1と等価だったり、キャストすると1になるのに、VBScriptのTrueは-1と等価なのでしょうか?

答え

VBScriptにはビット演算と論理演算を同じ演算子で行うため。

C言語やRubyやPythonやJavaScriptなどの主要な言語では、ビット演算と論理演算が明確に区別されています。

/* C言語 */
a = b & c /* ビット演算 */
a = b && c /* 論理演算 */
# Ruby
a = b & c # ビット演算
a = b && c # 論理演算
# Python
a = b & c # ビット演算
a = b and c # 論理演算
/* JavaScript */
a = b & c /* ビット演算 */
a = b && c /* 論理演算 */

一方VBScriptでは、これら2つの演算はどちらも同じ演算子によってなされます。

' VBScript
a = b And c ' ビット演算
a = b And c ' 論理演算

参考: And演算子

ここでは、And演算子のみを例に出しましたが、Or演算子やNot演算子についても同様です。

では、他の言語では別々の演算子によって提供されている機能を、VBScriptはどうやって1つの演算子のみで提供しているのでしょうか?

VBScriptにはビット演算子しかなく、TrueとFalseをいい感じに整数型にマッピングすることによって論理演算子っぽく見せているのが真相です。
そのためには、Trueをすべてのbitが1の整数に、Falseをすべてのbitが0の整数にマッピングすることが必要であり、またそうする以外にこの要件を満たすマッピング方法はありません(必要十分条件)。

さて、このように符号化されたTrueとFalseを数値型の表現に復号するとどうなるのでしょうか?
Falseが0になることは自明ですが、Trueはどうなるのでしょうか?
VBScriptの整数型は符号付き16bit整数で、負数の表現方法には2の補数形式が使われています。
そのため、すべてのbitが1の整数は-1という数値を表すことになります。

このような理由によってVBScriptのTrueは-1と等価になります。他の言語にはない珍しい仕様ですので、やや注意が必要です。
例えば、C言語のテクニックにエラー時は負数を返すというものがありますが、同様のことをVBScriptでやると罠にはまる危険性があります。

12
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?