Arduino で 2進数の定数をどう表記する?
Arduino のスケッチ(プログラム)を作成する際、16進数の場合には 0xB3 と、C言語と同じように表記します。2進数の定数を記述するには、B10110011 という風に、数字の先頭に B を付けて表記します。
この辺りの話は、Arduino のプログラミングをはじめようとして、何かしらの資料を読んでいると、まず目にするところだと思います。 …と言うか、当たり前すぎて見過ごしてしまうところかもしれません。
昔ながらの C言語には、2進数で定数を記述する方法は規定されていませんでしたが、最近の gcc などのいくつかの C言語や、Python、Java などでは、0b10110011 と 0b を先頭に付けることで、2進数を記述できます。
なぜ、Arduino のソフトウェアを設計・考案した人たちは、2進数の表記方法を既に存在している 0b ではなく、独自の B を採用したのでしょう?
こんなことに疑問を感じたのは... C言語でばかりプログラムを作っていた わたし の感覚では、
- 0x を付けると 16進数
- 何も付けなければ 10進数
- 0 を付けると 8進数になるので注意
- 2進数では定数を書けない
- 一部の C言語では 0b を付けると 2進数
と思っていました。そのため、Arduino のスケッチで B を付けると 2進数、というルールを、すっかり忘れていました。(^-^; そして、Arduino UNO に実装されている ATmega328 をポート単位でアクセスしたくて、ポート B の bit 0 を B0 と宣言したところ、「二重に宣言した!」とコンパイル時に警告されてしまったのです。
言語の仕様として、B を先頭に付けると 2進数として扱われるのであれば、0987 と表記すると、0 が先頭に付いているので 8進数なのに、8進数としてはありえない 8 や 9 が使われている、とコンパイル時に検出されます。しかし、B0 と B1 は警告されるものの、B2 や B3、B4、B5 は警告の対象になりません。
不思議に思って、警告のメッセージを確認してみると、
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/binary.h:23:0: note: this is the location of the previous definition
#define B0 0
と表示されていました。 で、上記のヘッダーファイルの中を確認してみたのが、はじめの写真です。このヘッダーファイルを見て、B2 や B3 が警告されない意味がわかりました。
しかし、
- Arduino の開発環境である Arduino IDE は内部では gcc でコンパイルしているにもかかわらず、gcc でもサポートしている 0b の表記を採用せず、独自ともいえる B を付加する方法を採用したのか?
- 16進数の表記を同じように H を付ける表記にしなかったのはなぜ?
- 2進数で 8bit 以上の表記をすることは考慮しないのか?
、という疑問が残りました。不思議な話だと思いませんか?