私は余暇のプロジェクトに取り組んでおり、Arduino Duemilanove にいくつかのサーバー コードを作成していますが、コントローラーでこのコードをテストする前に、自分のマシン (OS X ベースの macbook) でテストしています。一部の場所で int を使用していますが、コードをコンパイルして Arduino Duemilanove で実行すると、奇妙なエラーが発生するのではないかと心配しています。これは、Arduino が int を 2 バイトとして処理し、私の macbook が int を 4 バイトとして処理するためです。私は筋金入りの C および C++ プログラマーではないので、経験豊富なプログラマーがこの状況をどのように処理するかについて少し心配しています。2 バイトに制限されている int の独自の定義をラップする typedef でコードを制限する必要がありますか? それとも別の方法がありますか?
5 に答える
あなたの最善の策は、stdint.h
ヘッダーを使用することです。変数の符号とサイズを明示的に参照する typedef を定義します。たとえば、16 ビットの符号なし整数はuint16_t
. これは C99 標準の一部であるため、ほとんどどこでも使用できます。見る:
C 標準では、int は、少なくとも -32768 から 32767 までのすべての整数を保持するのに十分な大きさの符号付き型であると定義されています。実装では、より大きな型を自由に選択でき、最新の32 ビットシステムは 32 ビット整数を選択します。ただし、これまで見てきたように、一部の組み込みプラットフォームは依然として 16 ビット整数を使用しています。arduino コンパイラがサポートしている場合は、uint16_t
またはを使用することをお勧めします。uint32_t
そうでない場合は、プリプロセッサ マクロを使用して、それらの型を自分で型定義してください。
この状況を処理する正しい方法は、表現する必要がある値に基づいて型を選択することです。
- それが一般的な小さい整数で、-32767 から 32767 の範囲で問題ない場合は
int
、;を使用します。 - それ以外の場合、-2147483647 から 2147483647 の範囲で問題ない場合は、
long
;を使用します。 - それ以外の場合は、 を使用します
long long
。 - -32767 から 32767 の範囲が OKで、スペース効率が重要な場合は
short
(またはsigned char
、-127 から 127 の範囲が OK の場合) を使用します。
これらの他の仮定を行わない限り (つまりsizeof
、型の幅を仮定する代わりに常に使用する)、コードは移植可能になります。
stdint.h
一般に、別のシステムとのバイナリ インターフェイスを介して交換される値には、固定幅型のみを使用する必要があります。ネットワークまたはファイルからの読み取りまたは書き込み。
−32,768 より小さい値または +32,767 より大きい値が必要ですか? そうでない場合は、さまざまなサイズを無視してください。それらが必要な場合は、intN_t/uintN_t (N = ビット数) と呼ばれる、符号付きおよび符号なしの固定サイズの整数を含む stdint.h があります。これは C99 ですが、ほとんどのコンパイラがサポートしています。CPU のワードサイズ (この場合は 16 ビット) より大きいサイズの整数を使用すると、それらを処理するためのネイティブ命令がないため、パフォーマンスが低下することに注意してください。
int
サイズはアーキテクチャ/コンパイラに依存する可能性があるため、型の使用は避けてください。
代わりにshort
andを使用long