ともかつの日記

仕事や日常で扱った PIC などのマイコンや Raspberry Pi、パソコンについて書き残していきます。

Arduino で 2進数の定数をどう表記する?

f:id:VEJ00675:20180223172541j:plain

Arduino のスケッチ(プログラム)を作成する際、16進数の場合には 0xB3 と、C言語と同じように表記します。2進数の定数を記述するには、B10110011 という風に、数字の先頭に B を付けて表記します。

この辺りの話は、Arduino のプログラミングをはじめようとして、何かしらの資料を読んでいると、まず目にするところだと思います。 …と言うか、当たり前すぎて見過ごしてしまうところかもしれません。

 昔ながらの C言語には、2進数で定数を記述する方法は規定されていませんでしたが、最近の gcc などのいくつかの C言語や、PythonJava などでは、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 以上の表記をすることは考慮しないのか?

、という疑問が残りました。不思議な話だと思いませんか?