フラグ (コンピュータ)

コンピュータにおけるフラグ（英: flag）とは、真か偽か・0か1か・マイナスが付くか付かないか、などといった情報量が1ビットの値（情報）を状態として保持する、レジスタや変数などのことである。メモリの節約などのために、複数ビットを持つ整数型を使って、フラグの集合をコンパクトに管理することもあれば、プログラムの可読性やメモリアドレッシングの高速化を優先して、1バイトや4バイトの整数型を使って単一の真偽値を管理することもある。 語源は「旗」を意味する英語 flag であり、旗を連想させるような「上げる・立てる」および対義語として「下ろす・降ろす・倒す」といった表現が使われることもあるが、他に「落ちる・落とす」などその他の表現が使われることもある。電気信号のアナロジーから、オン／オフ（ON/OFF）という表現が使われることもある。プログラミング言語のソースコード上では、変数への真値の代入によりフラグを立てる操作に相当する処理を、また偽値の代入によりフラグを降ろす操作に相当する処理を書くことができる。 以上の他に「トグル」（英: toggle）という操作がある。押しボタン型スイッチに見られる「プッシュ・プッシュ型」のように、操作の度に状態が交互に切り替わるような操作である。この操作は、プログラミング言語のソースコード上では条件分岐や条件演算子と再代入を使って書くことができるが、x = !xのように論理否定演算子と再代入を使ったり、x.toggle()のようにメソッドを使ったりして簡潔に書くことのできる言語もある。 またフラグが集まったバイト・ワード等の一部を操作するには、ビットマスクを用いたビット単位の演算を使う。 例: Z80のステータスレジスタ Sフラグ: 計算結果の正負 Zフラグ: 計算結果がゼロかどうか Hフラグ: 4ビットで表しきれないとき1（パックBCD向けのキャリーフラグ） P/Vフラグ: パリティ・オーバーフロー Nフラグ: 減算のとき1、加算のとき0 Cフラグ: 8ビットで表しきれないときに立つキャリーフラグ フラグとして変数を定義するとき、ブーリアン型を用いることがほとんどである。ブーリアン型は「真」（フラグが立っている）および「偽」（フラグが立っていない）のみを値として受けつけ、都合が良いからである。JavaやC#のif文など、条件式が期待される文脈ではブーリアン型しか受け入れられない言語もある。真値と偽値には、trueやfalseといった専用リテラルがキーワードまたは予約語として用意されていることが多い。 古い規格バージョンのC言語（ANSI C規格など）に代表されるように、ブーリアン型が無い言語もある。そういった言語では、多くが組み込みの固定長整数型または数値型で代用する仕様となっている。C言語の場合、0が偽、0以外が真として扱われる。C言語では偽値の論理否定は真値の代表値すなわち1となる仕様であり、例えば !0 は1になり、真値の二重否定 !!"hello" は1になる。このような慣習はシステムや言語、ソフトウェアフレームワークによって大きく異なることが多く、例えばUnixシェルでは0が真で1が偽である。他には-1が真で0が偽という環境もある。 日本ではフラグという言葉がコンピュータ用語の枠を超えて広まっていったのは1980年代後半からとみられ、パソコン雑誌では『コンプティーク』1985年7、8月号（角川書店）で「持ち物のフラグによるトリック」との見出しがあり、1986、7年の『ログイン』（アスキー）、『マイコンBASICマガジン』（電波新聞社）のアドベンチャーゲーム記事で「フラグ」が何度も使われている。 次いでパチスロ界隈で使われるようになり、1988年3月発行の『パチンコ攻略マガジン』NO.2（プラントピア）で「フラッグ」、1989年10月発行の『パチスロ機種別完全攻略本』（西東社）で「フラグが立つ」との記述があり、『週刊プレイボーイ』1989年4月25日号（集英社）でパチスロ用語として紹介されている。 ファミコン雑誌では1988年までほぼ見受けられないが、ファミコン通信1987年4月17日号の堀井雄二による記事「『ドラゴンクエストII』ができるまで 前編」で注釈なしの使用例がみられ、この記事は『ログイン』1987年4、5月号で連載したコラム「ゆう坊やの虹色ディップスイッチ」を再構成したもので、堀井が同誌で短期連載していた『堀井雄二の実践的アドベンチャーのつくり方』では1986年5月号で「フラグ編」と題して説明がなされていることから、改めて説明するまでもなく、ファミコン通信掲載時にはチェック漏れがあった可能性がある。そして先述のパチスロには興味はないが週刊プレイボーイのような青年誌を読んだゲーム雑誌ライターも使うようになり、1990年に「ゆう坊やの虹色ディップスイッチ」の単行本化の際には注釈が存在、この頃にゲーム制作に興味がある子供に知られていったとみられる。 ^ ブーリアン型が整数型によって実装されており、また真値として整数値1のみをとることが常に保証されている場合は、x = 1 - xといった算術演算で書くこともできるが、可読性や移植性を損なうため、そのようなコードを書くことは避けるべきである。同様に、0をインクリメントすれば1になるからといって、フラグ変数に真値を設定するつもりでインクリメント操作を使用すると、ラップアラウンドや算術オーバーフローによって意図しない動作になる可能性もある。安全性を軽視したトリッキーなコードを不用意に記述すると、場合によってはセラック25のように取り返しのつかない大事故を引き起こす致命的なバグとなる。Javaに代表される後発のプログラミング言語では、安全性に配慮してブーリアン型を整数型として扱えないような仕様になっているものが多い。 ^ 3値論理の場合は「不明」という値も取りうる。 ^ C99規格では_Bool型が導入されたが、これはJavaのような純粋なブーリアン型ではなく、標準符号無し整数型のひとつとして規定されており、整数型と相互に暗黙変換が可能となっている。 ^ AWKなど、ブーリアン型だけでなく整数型すら持たず、1種類の数値型しかないような言語の場合。 ^ ヌルポインタのような0相当の値も含む。 ^ exitシステムコール（英語版）が返す終了コードに関係する。 ^ 2の補数表現では、真を -1 にすると、論理否定とビット反転が兼用できるという利点がある。なおC言語およびC++20規格よりも前のC++では、符号付き整数の内部表現が規定されていないため、負の数に対するビット単位の演算結果は処理系定義となる。 ^ COMのバリアント型におけるVT_BOOLや、Visual BasicおよびVisual Basic .NETのBoolean型などが挙げられる。 ^ INT13-C. ビット単位の演算子は符号無しオペランドに対してのみ使用する ^ 符号付き整数型が2の補数表現であることを規定 - cpprefjp C++日本語リファレンス ^ VARENUM (wtypes.h) - Win32 apps | Microsoft Learn ^ Boolean データ型 - Visual Basic | Microsoft Learn ^ a b c “「フラグ」という言葉をプレイヤーも使い始めたのはいつから?──その起源はPCゲーム誌、堀井雄二、そしてパチスロ攻略本”. 電ファミニコゲーマー (マレ): p. 1. (2019年7月16日). https://news.denfaminicogamer.jp/kikakuthetower/190716a 2020年4月24日閲覧。  ^ a b “「フラグ」という言葉をプレイヤーも使い始めたのはいつから?──その起源はPCゲーム誌、堀井雄二、そしてパチスロ攻略本”. 電ファミニコゲーマー (マレ): p. 2. (2019年7月16日). https://news.denfaminicogamer.jp/kikakuthetower/190716a/2 2020年4月24日閲覧。  カウンタ - プログラマブル・カウンタ 束論 ブール代数 - 数理論理学 論理回路 符号ビット（英語版） 表示 編集